From 9bbdae0230087519f3b94816fe216519a2ac8c1b Mon Sep 17 00:00:00 2001 From: Matt Nguyen Date: Tue, 16 Jan 2024 14:51:19 -0800 Subject: [PATCH] OpenAPI generated code at 2024-01-16T22:51:07Z --- CHANGELOG.md | 22 + api.ts | 981 ++++++++++++++++++++++++++++++++++++---- base.ts | 2 +- common.ts | 2 +- configuration.ts | 4 +- dist/api.d.ts | 695 ++++++++++++++++++++++++++-- dist/api.js | 353 +++++++++++++-- dist/base.d.ts | 2 +- dist/base.js | 4 +- dist/common.d.ts | 2 +- dist/common.js | 4 +- dist/configuration.d.ts | 2 +- dist/configuration.js | 6 +- dist/index.d.ts | 2 +- dist/index.js | 4 +- index.ts | 2 +- package.json | 2 +- 17 files changed, 1911 insertions(+), 178 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94de3d4e..349f8fe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ See full changelog for the OpenAPI schema (OAS) [here](https://github.com/plaid/plaid-openapi/blob/master/CHANGELOG.md). +# 18.3.0 +- Updating to OAS 2020-09-14_1.485.0 + +## OpenAPI Schema Changes +### 2020-09-14_1.485.0 +- Add `/processor/liabilities/get` endpoint + +### 2020-09-14_1.484.1 +- Add `/identity_verification/autofill/create` (closed beta) + +### 2020-09-14_1.484.0 +- Add `/statements/refresh` endpoint + +### 2020-09-14_1.483.2 +- Add `/beacon/duplicate/get` route + +### 2020-09-14_1.483.1 +- Internal changes only + +### 2020-09-14_1.483.0 +- Added net new fields to StatementsAccount object: `account_mask`, `account_subtype`, `account_official_name` + # 18.2.0 - Updating to OAS 2020-09-14_1.482.3 diff --git a/api.ts b/api.ts index 2813a99c..3b0b2569 100644 --- a/api.ts +++ b/api.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -161,7 +161,7 @@ export interface AccountAssets { */ verification_status?: AccountAssetsVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountAssets */ @@ -302,7 +302,7 @@ export interface AccountBalance { */ unofficial_currency_code: string | null; /** - * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time that the balance for the given account has been updated This is currently only provided when the `min_last_updated_datetime` is passed when calling `/accounts/balance/get` for `ins_128026` (Capital One). + * Timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the oldest acceptable balance when making a request to `/accounts/balance/get`. This field is only used and expected when the institution is `ins_128026` (Capital One) and the Item contains one or more accounts with a non-depository account type, in which case a value must be provided or an `INVALID_REQUEST` error with the code of `INVALID_FIELD` will be returned. For Capital One depository accounts as well as all other account types on all other institutions, this field is ignored. See [account type schema](https://en.wikipedia.org/wiki/ISO_8601) for a full list of account types. If the balance that is pulled is older than the given timestamp for Items with this field required, an `INVALID_REQUEST` error with the code of `LAST_UPDATED_DATETIME_OUT_OF_RANGE` will be returned with the most recent timestamp for the requested account contained in the response. * @type {string} * @memberof AccountBalance */ @@ -366,7 +366,7 @@ export interface AccountBase { */ verification_status?: AccountBaseVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountBase */ @@ -509,7 +509,7 @@ export interface AccountIdentity { */ verification_status?: AccountIdentityVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountIdentity */ @@ -618,7 +618,7 @@ export interface AccountIdentityMatchScore { */ verification_status?: AccountIdentityMatchScoreVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountIdentityMatchScore */ @@ -4814,7 +4814,7 @@ export interface BaseReportAccountBalances { */ unofficial_currency_code: string | null; /** - * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time that the balance for the given account has been updated This is currently only provided when the `min_last_updated_datetime` is passed when calling `/accounts/balance/get` for `ins_128026` (Capital One). + * Timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the oldest acceptable balance when making a request to `/accounts/balance/get`. This field is only used and expected when the institution is `ins_128026` (Capital One) and the Item contains one or more accounts with a non-depository account type, in which case a value must be provided or an `INVALID_REQUEST` error with the code of `INVALID_FIELD` will be returned. For Capital One depository accounts as well as all other account types on all other institutions, this field is ignored. See [account type schema](https://en.wikipedia.org/wiki/ISO_8601) for a full list of account types. If the balance that is pulled is older than the given timestamp for Items with this field required, an `INVALID_REQUEST` error with the code of `LAST_UPDATED_DATETIME_OUT_OF_RANGE` will be returned with the most recent timestamp for the requested account contained in the response. * @type {string} * @memberof BaseReportAccountBalances */ @@ -5396,6 +5396,124 @@ export interface BeaconDuplicateDetectedWebhook { */ environment: WebhookEnvironmentValues; } +/** + * Request input for getting a Beacon Duplicate + * @export + * @interface BeaconDuplicateGetRequest + */ +// Edited by Plaid, line 9. any to unknown +export interface BeaconDuplicateGetRequest { + /** + * ID of the associated Beacon Duplicate. + * @type {string} + * @memberof BeaconDuplicateGetRequest + */ + beacon_duplicate_id: string; + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof BeaconDuplicateGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof BeaconDuplicateGetRequest + */ + secret?: string; +} +/** + * A Beacon Duplicate represents a pair of matching Beacon Users and an analysis of the fields they matched on. + * @export + * @interface BeaconDuplicateGetResponse + */ +// Edited by Plaid, line 9. any to unknown +export interface BeaconDuplicateGetResponse { + [key: string]: object | unknown; + + /** + * ID of the associated Beacon Duplicate. + * @type {string} + * @memberof BeaconDuplicateGetResponse + */ + id: string; + /** + * + * @type {BeaconUserRevision} + * @memberof BeaconDuplicateGetResponse + */ + beacon_user1: BeaconUserRevision; + /** + * + * @type {BeaconUserRevision} + * @memberof BeaconDuplicateGetResponse + */ + beacon_user2: BeaconUserRevision; + /** + * + * @type {BeaconMatchSummaryAnalysis} + * @memberof BeaconDuplicateGetResponse + */ + analysis: BeaconMatchSummaryAnalysis; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof BeaconDuplicateGetResponse + */ + request_id: string; +} +/** + * Analysis of which fields matched between one Beacon User and another. + * @export + * @interface BeaconMatchSummaryAnalysis + */ +// Edited by Plaid, line 9. any to unknown +export interface BeaconMatchSummaryAnalysis { + [key: string]: object | unknown; + + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + address: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + date_of_birth: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + email_address: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + name: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + id_number: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + ip_address: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + phone_number: BeaconMatchSummaryCode; +} /** * An enum indicating the match type between two Beacon Users. `match` indicates that the provided input data was a strong match against the other Beacon User. `partial_match` indicates the data approximately matched the other Beacon User. For example, \"Knope\" vs. \"Knope-Wyatt\" for last name. `no_match` indicates that Plaid was able to compare this field against the other Beacon User and it did not match the provided input data. `no_data` indicates that Plaid was unable to compare this field against the original Beacon User because the field was not present in one of the Beacon Users. * @export @@ -6065,7 +6183,7 @@ export interface BeaconUserAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof BeaconUserAddress */ @@ -6421,7 +6539,7 @@ export interface BeaconUserRequestAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof BeaconUserRequestAddress */ @@ -6467,7 +6585,7 @@ export interface BeaconUserRequestAddressNullable { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof BeaconUserRequestAddressNullable */ @@ -6587,6 +6705,28 @@ export interface BeaconUserReviewRequest { */ secret?: string; } +/** + * A Beacon User Revision identifies a Beacon User at some point in its revision history. + * @export + * @interface BeaconUserRevision + */ +// Edited by Plaid, line 9. any to unknown +export interface BeaconUserRevision { + [key: string]: object | unknown; + + /** + * ID of the associated Beacon User. + * @type {string} + * @memberof BeaconUserRevision + */ + id: string; + /** + * The `version` field begins with 1 and increments with each subsequent revision. + * @type {number} + * @memberof BeaconUserRevision + */ + version: number; +} /** * A status of a Beacon User. `rejected`: The Beacon User has been rejected for fraud. Users can be automatically or manually rejected. `pending_review`: The Beacon User has been marked for review. `cleared`: The Beacon User has been cleared of fraud. * @export @@ -15667,7 +15807,7 @@ export interface Holding { */ institution_value: number; /** - * The original total value of the holding. This field is calculated by Plaid as the sum of the purchase price of all of the shares in the holding. + * The total cost basis of the holding (e.g., the total amount spent to acquire all assets currently in the holding). * @type {number} * @memberof Holding */ @@ -15763,7 +15903,7 @@ export interface HoldingsOverride { */ institution_price_as_of?: string; /** - * The average original value of the holding. Multiple cost basis values for the same security purchased at different prices are not supported. + * The total cost basis of the holding (e.g., the total amount spent to acquire all assets currently in the holding). * @type {number} * @memberof HoldingsOverride */ @@ -16355,6 +16495,156 @@ export interface IdentityVerification { */ redacted_at: string | null; } +/** + * Even if an address has been autofilled, some fields may be null depending on the region\'s addressing system. For example: Addresses from the United Kingdom will not include a region Addresses from Hong Kong will not include postal code + * @export + * @interface IdentityVerificationAutofillAddress + */ +// Edited by Plaid, line 9. any to unknown +export interface IdentityVerificationAutofillAddress { + [key: string]: object | unknown; + + /** + * The primary street portion of an address. If an address is provided, this field will always be filled. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + street: string; + /** + * Extra street information, like an apartment or suite number. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + street2: string | null; + /** + * City from the end user\'s address + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + city: string | null; + /** + * An ISO 3166-2 subdivision code. Related terms would be \"state\", \"province\", \"prefecture\", \"zone\", \"subdivision\", etc. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + region: string | null; + /** + * The postal code for the associated address. Between 2 and 10 alphanumeric characters. For US-based addresses this must be 5 numeric digits. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + postal_code: string | null; + /** + * Valid, capitalized, two-letter ISO code representing the country of this object. Must be in ISO 3166-1 alpha-2 form. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + country: string; + /** + * + * @type {POBoxStatus} + * @memberof IdentityVerificationAutofillAddress + */ + po_box: POBoxStatus; + /** + * + * @type {AddressPurposeLabel} + * @memberof IdentityVerificationAutofillAddress + */ + type: AddressPurposeLabel; +} +/** + * Request input to autofill an Identity Verification + * @export + * @interface IdentityVerificationAutofillCreateRequest + */ +// Edited by Plaid, line 9. any to unknown +export interface IdentityVerificationAutofillCreateRequest { + /** + * ID of the associated Identity Verification attempt. + * @type {string} + * @memberof IdentityVerificationAutofillCreateRequest + */ + identity_verification_id: string; + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof IdentityVerificationAutofillCreateRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof IdentityVerificationAutofillCreateRequest + */ + secret?: string; +} +/** + * Autofill represents unverified customer information. This needs to be confirmed by the customer before using. + * @export + * @interface IdentityVerificationAutofillCreateResponse + */ +// Edited by Plaid, line 9. any to unknown +export interface IdentityVerificationAutofillCreateResponse { + [key: string]: object | unknown; + + /** + * + * @type {IdentityVerificationAutofillStatus} + * @memberof IdentityVerificationAutofillCreateResponse + */ + status: IdentityVerificationAutofillStatus; + /** + * + * @type {IdentityVerificationAutofillUserData} + * @memberof IdentityVerificationAutofillCreateResponse + */ + user: IdentityVerificationAutofillUserData | null; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof IdentityVerificationAutofillCreateResponse + */ + request_id: string; +} +/** + * A status enum indicating whether autofill succeeded or failed. + * @export + * @enum {string} + */ +export enum IdentityVerificationAutofillStatus { + Success = 'success', + Failed = 'failed' +} + +/** + * User information that was autofilled. All this information should be confirmed by the user before using. + * @export + * @interface IdentityVerificationAutofillUserData + */ +// Edited by Plaid, line 9. any to unknown +export interface IdentityVerificationAutofillUserData { + [key: string]: object | unknown; + + /** + * + * @type {IdentityVerificationResponseUserName} + * @memberof IdentityVerificationAutofillUserData + */ + name: IdentityVerificationResponseUserName | null; + /** + * + * @type {IdentityVerificationAutofillAddress} + * @memberof IdentityVerificationAutofillUserData + */ + address: IdentityVerificationAutofillAddress | null; + /** + * + * @type {UserIDNumber} + * @memberof IdentityVerificationAutofillUserData + */ + id_number: UserIDNumber | null; +} /** * Request schema for \'/identity_verification/create\' * @export @@ -16615,7 +16905,7 @@ export interface IdentityVerificationDocumentAddressResponse { country: string; } /** - * Request input for fetching an identity verification + * Request input for fetching an Identity Verification * @export * @interface IdentityVerificationGetRequest */ @@ -16753,7 +17043,7 @@ export interface IdentityVerificationGetResponse { request_id: string; } /** - * Request input for listing identity verifications + * Request input for listing Identity Verifications * @export * @interface IdentityVerificationListRequest */ @@ -17183,7 +17473,7 @@ export interface IdentityVerificationStatusUpdatedWebhook { environment: WebhookEnvironmentValues; } /** - * The status of a step in the identity verification process. + * The status of a step in the Identity Verification process. * @export * @enum {string} */ @@ -17288,7 +17578,7 @@ export interface IdentityVerificationStepUpdatedWebhook { environment: WebhookEnvironmentValues; } /** - * The resource ID and version number of the template configuring the behavior of a given identity verification. + * The resource ID and version number of the template configuring the behavior of a given Identity Verification. * @export * @interface IdentityVerificationTemplateReference */ @@ -17319,7 +17609,7 @@ export interface IdentityVerificationUserAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof IdentityVerificationUserAddress */ @@ -17356,7 +17646,7 @@ export interface IdentityVerificationUserAddress { country: string; } /** - * The identity data that was either collected from the user or provided via API in order to perform an identity verification. + * The identity data that was either collected from the user or provided via API in order to perform an Identity Verification. * @export * @interface IdentityVerificationUserData */ @@ -22561,7 +22851,7 @@ export interface LinkTokenCreateHostedLink { // Edited by Plaid, line 9. any to unknown export interface LinkTokenCreateInstitutionData { /** - * The routing number of the bank to highlight. + * The routing number of the bank to highlight in Link. Note: in rare cases, a single routing number can be associated with multiple institutions, e.g. due to a brokerage using another institution to manage ACH on its sweep accounts. If this happens, the bank will not be highlighted in Link even if the routing number is provided. * @type {string} * @memberof LinkTokenCreateInstitutionData */ @@ -25967,11 +26257,11 @@ export interface PayPeriodDetails { */ pay_date?: string | null; /** - * The frequency at which an individual is paid. - * @type {string} + * + * @type {PayPeriodDetailsPayFrequency} * @memberof PayPeriodDetails */ - pay_frequency?: PayPeriodDetailsPayFrequencyEnum; + pay_frequency?: PayPeriodDetailsPayFrequency | null; /** * The date on which the paystub was issued, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (\"yyyy-mm-dd\"). * @type {string} @@ -25986,12 +26276,12 @@ export interface PayPeriodDetails { */ start_date?: string | null; } - /** - * @export - * @enum {string} - */ -export enum PayPeriodDetailsPayFrequencyEnum { + * The frequency at which an individual is paid. + * @export + * @enum {string} + */ +export enum PayPeriodDetailsPayFrequency { PayFrequencyUnknown = 'PAY_FREQUENCY_UNKNOWN', PayFrequencyWeekly = 'PAY_FREQUENCY_WEEKLY', PayFrequencyBiweekly = 'PAY_FREQUENCY_BIWEEKLY', @@ -27138,7 +27428,7 @@ export interface PaymentInitiationPaymentCreateRequest { */ recipient_id: string; /** - * A reference for the payment. This must be an alphanumeric string with at most 18 characters and must not contain any special characters (since not all institutions support them). In order to track settlement via Payment Confirmation, each payment must have a unique reference. If the reference provided through the API is not unique, Plaid will adjust it. Both the originally provided and automatically adjusted references (if any) can be found in the `reference` and `adjusted_reference` fields, respectively. + * A reference for the payment. This must be an alphanumeric string with at most 18 characters and must not contain any special characters (since not all institutions support them). In order to track settlement via Payment Confirmation, each payment must have a unique reference. If the reference provided through the API is not unique, Plaid will adjust it. Some institutions may limit the reference to less than 18 characters. If necessary, Plaid will adjust the reference by truncating it to fit the institution\'s requirements. Both the originally provided and automatically adjusted references (if any) can be found in the `reference` and `adjusted_reference` fields, respectively. * @type {string} * @memberof PaymentInitiationPaymentCreateRequest */ @@ -28581,10 +28871,56 @@ export interface PaystubOverride { income_breakdown?: Array; /** * - * @type {PayPeriodDetails} + * @type {PaystubOverridePayPeriodDetails} * @memberof PaystubOverride */ - pay_period_details?: PayPeriodDetails; + pay_period_details?: PaystubOverridePayPeriodDetails; +} +/** + * Information about the accounts that the payment was distributed to. + * @export + * @interface PaystubOverrideDistributionBreakdown + */ +// Edited by Plaid, line 9. any to unknown +export interface PaystubOverrideDistributionBreakdown { + [key: string]: object | unknown; + + /** + * Name of the account for the given distribution. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + account_name?: string | null; + /** + * The name of the bank that the payment is being deposited to. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + bank_name?: string | null; + /** + * The amount distributed to this account. + * @type {number} + * @memberof PaystubOverrideDistributionBreakdown + */ + current_amount?: number | null; + /** + * The ISO-4217 currency code of the net pay. Always `null` if `unofficial_currency_code` is non-null. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + currency?: string | null; + /** + * The last 2-4 alphanumeric characters of an account\'s official account number. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + mask?: string | null; + /** + * Type of the account that the paystub was sent to (e.g. \'checking\'). + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + type?: string | null; } /** * The employee on the paystub. @@ -28658,6 +28994,65 @@ export interface PaystubOverrideEmployer { */ name?: string; } +/** + * Details about the pay period. + * @export + * @interface PaystubOverridePayPeriodDetails + */ +// Edited by Plaid, line 9. any to unknown +export interface PaystubOverridePayPeriodDetails { + [key: string]: object | unknown; + + /** + * The amount of the paycheck. + * @type {number} + * @memberof PaystubOverridePayPeriodDetails + */ + check_amount?: number | null; + /** + * + * @type {Array} + * @memberof PaystubOverridePayPeriodDetails + */ + distribution_breakdown?: Array; + /** + * The pay period end date, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format: \"yyyy-mm-dd\". + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + */ + end_date?: string | null; + /** + * Total earnings before tax/deductions. + * @type {number} + * @memberof PaystubOverridePayPeriodDetails + */ + gross_earnings?: number | null; + /** + * The date on which the paystub was issued, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (\"yyyy-mm-dd\"). + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + */ + pay_date?: string | null; + /** + * + * @type {PayPeriodDetailsPayFrequency} + * @memberof PaystubOverridePayPeriodDetails + */ + pay_frequency?: PayPeriodDetailsPayFrequency | null; + /** + * The date on which the paystub was issued, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (\"yyyy-mm-dd\"). + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + * @deprecated + */ + pay_day?: string | null; + /** + * The pay period start date, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format: \"yyyy-mm-dd\". + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + */ + start_date?: string | null; +} /** * The frequency at which the employee is paid. Possible values: `MONTHLY`, `BI-WEEKLY`, `WEEKLY`, `SEMI-MONTHLY`. * @export @@ -29639,6 +30034,60 @@ export interface ProcessorInitialUpdateWebhook { */ environment: WebhookEnvironmentValues; } +/** + * ProcessorLiabilitiesGetRequest defines the request schema for `/processor/liabilities/get` + * @export + * @interface ProcessorLiabilitiesGetRequest + */ +// Edited by Plaid, line 9. any to unknown +export interface ProcessorLiabilitiesGetRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof ProcessorLiabilitiesGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof ProcessorLiabilitiesGetRequest + */ + secret?: string; + /** + * The processor token obtained from the Plaid integration partner. Processor tokens are in the format: `processor--` + * @type {string} + * @memberof ProcessorLiabilitiesGetRequest + */ + processor_token: string; +} +/** + * ProcessorLiabilitiesGetResponse defines the response schema for `/processor/liabilities/get` + * @export + * @interface ProcessorLiabilitiesGetResponse + */ +// Edited by Plaid, line 9. any to unknown +export interface ProcessorLiabilitiesGetResponse { + [key: string]: object | unknown; + + /** + * + * @type {AccountBase} + * @memberof ProcessorLiabilitiesGetResponse + */ + account: AccountBase; + /** + * + * @type {LiabilitiesObject} + * @memberof ProcessorLiabilitiesGetResponse + */ + liabilities: LiabilitiesObject; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof ProcessorLiabilitiesGetResponse + */ + request_id: string; +} /** * An object containing identifying numbers used for making electronic transfers to and from the `account`. The identifying number type (ACH, EFT, IBAN, or BACS) used will depend on the country of the account. An account may have more than one number type. If a particular identifying number type is not used by the `account` for which auth data has been requested, a null value will be returned. * @export @@ -32129,6 +32578,26 @@ export interface RiskCheckSyntheticIdentity { */ score: number; } +/** + * Details about the transaction result after evaluated by the requested risk profile. If a `risk_profile_key` is not provided, this field will be omitted. This feature is currently in closed beta; to request access, contact your account manager. + * @export + * @interface RiskProfile + */ +// Edited by Plaid, line 9. any to unknown +export interface RiskProfile { + /** + * The name of the risk profile used for this transaction. + * @type {string} + * @memberof RiskProfile + */ + key?: string; + /** + * The name of the evaluated outcome for this transaction. + * @type {string} + * @memberof RiskProfile + */ + outcome?: string; +} /** * Object containing metadata for the document * @export @@ -34888,6 +35357,12 @@ export interface SignalEvaluateRequest { * @memberof SignalEvaluateRequest */ device?: SignalDevice; + /** + * The name of the risk profile to use for this transaction. A risk profile can be configured using via the Plaid Dashboard. If not provided, no risk profile will be used. This feature is currently in closed beta; to request access, contact your account manager. + * @type {string} + * @memberof SignalEvaluateRequest + */ + risk_profile_key?: string | null; } /** * SignalEvaluateResponse defines the response schema for `/signal/income/evaluate` @@ -34916,6 +35391,12 @@ export interface SignalEvaluateResponse { * @memberof SignalEvaluateResponse */ core_attributes?: SignalEvaluateCoreAttributes; + /** + * + * @type {RiskProfile} + * @memberof SignalEvaluateResponse + */ + risk_profile?: RiskProfile | null; /** * If bank information was not available to be used in the Signal model, this array contains warnings describing why bank data is missing. If you want to receive an API error instead of Signal scores in the case of missing bank data, file a support ticket or contact your Plaid account manager. * @type {Array} @@ -35382,6 +35863,12 @@ export interface StatementsAccount { * @memberof StatementsAccount */ account_id: string; + /** + * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * @type {string} + * @memberof StatementsAccount + */ + account_mask: string; /** * The name of the account, either assigned by the user or by the financial institution itself. * @type {string} @@ -35389,7 +35876,19 @@ export interface StatementsAccount { */ account_name: string; /** - * The type of account. Possible values are investment, credit, depository, loan, brokerage, other. + * The official name of the account as given by the financial institution. + * @type {string} + * @memberof StatementsAccount + */ + account_official_name: string; + /** + * The subtype of the account. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). + * @type {string} + * @memberof StatementsAccount + */ + account_subtype: string; + /** + * The type of account. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {string} * @memberof StatementsAccount */ @@ -42582,7 +43081,7 @@ export interface UserAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof UserAddress */ @@ -47217,7 +47716,52 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(bankTransferGetRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(bankTransferGetRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. + * @summary List bank transfers + * @param {BankTransferListRequest} bankTransferListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferList: async (bankTransferListRequest: BankTransferListRequest, options: any = {}): Promise => { + // verify required parameter 'bankTransferListRequest' is not null or undefined + assertParamExists('bankTransferList', 'bankTransferListRequest', bankTransferListRequest) + const localVarPath = `/bank_transfer/list`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(bankTransferListRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -47225,16 +47769,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. - * @summary List bank transfers - * @param {BankTransferListRequest} bankTransferListRequest + * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. + * @summary Migrate account into Bank Transfers + * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - bankTransferList: async (bankTransferListRequest: BankTransferListRequest, options: any = {}): Promise => { - // verify required parameter 'bankTransferListRequest' is not null or undefined - assertParamExists('bankTransferList', 'bankTransferListRequest', bankTransferListRequest) - const localVarPath = `/bank_transfer/list`; + bankTransferMigrateAccount: async (bankTransferMigrateAccountRequest: BankTransferMigrateAccountRequest, options: any = {}): Promise => { + // verify required parameter 'bankTransferMigrateAccountRequest' is not null or undefined + assertParamExists('bankTransferMigrateAccount', 'bankTransferMigrateAccountRequest', bankTransferMigrateAccountRequest) + const localVarPath = `/bank_transfer/migrate_account`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -47262,7 +47806,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(bankTransferListRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(bankTransferMigrateAccountRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -47270,16 +47814,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. - * @summary Migrate account into Bank Transfers - * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest + * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. + * @summary Retrieve a sweep + * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - bankTransferMigrateAccount: async (bankTransferMigrateAccountRequest: BankTransferMigrateAccountRequest, options: any = {}): Promise => { - // verify required parameter 'bankTransferMigrateAccountRequest' is not null or undefined - assertParamExists('bankTransferMigrateAccount', 'bankTransferMigrateAccountRequest', bankTransferMigrateAccountRequest) - const localVarPath = `/bank_transfer/migrate_account`; + bankTransferSweepGet: async (bankTransferSweepGetRequest: BankTransferSweepGetRequest, options: any = {}): Promise => { + // verify required parameter 'bankTransferSweepGetRequest' is not null or undefined + assertParamExists('bankTransferSweepGet', 'bankTransferSweepGetRequest', bankTransferSweepGetRequest) + const localVarPath = `/bank_transfer/sweep/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -47307,7 +47851,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(bankTransferMigrateAccountRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(bankTransferSweepGetRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -47315,16 +47859,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. - * @summary Retrieve a sweep - * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - bankTransferSweepGet: async (bankTransferSweepGetRequest: BankTransferSweepGetRequest, options: any = {}): Promise => { - // verify required parameter 'bankTransferSweepGetRequest' is not null or undefined - assertParamExists('bankTransferSweepGet', 'bankTransferSweepGetRequest', bankTransferSweepGetRequest) - const localVarPath = `/bank_transfer/sweep/get`; + bankTransferSweepList: async (bankTransferSweepListRequest: BankTransferSweepListRequest, options: any = {}): Promise => { + // verify required parameter 'bankTransferSweepListRequest' is not null or undefined + assertParamExists('bankTransferSweepList', 'bankTransferSweepListRequest', bankTransferSweepListRequest) + const localVarPath = `/bank_transfer/sweep/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -47352,7 +47896,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(bankTransferSweepGetRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(bankTransferSweepListRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -47360,16 +47904,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. - * @summary List sweeps - * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * This endpoint allows the customer to retrieve a Base Report. Customers should pass in the `user_token` created in `/link/token/create`. + * @summary Retrieve a Base Report + * @param {BaseReportGetRequest} baseReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - bankTransferSweepList: async (bankTransferSweepListRequest: BankTransferSweepListRequest, options: any = {}): Promise => { - // verify required parameter 'bankTransferSweepListRequest' is not null or undefined - assertParamExists('bankTransferSweepList', 'bankTransferSweepListRequest', bankTransferSweepListRequest) - const localVarPath = `/bank_transfer/sweep/list`; + baseReportGet: async (baseReportGetRequest: BaseReportGetRequest, options: any = {}): Promise => { + // verify required parameter 'baseReportGetRequest' is not null or undefined + assertParamExists('baseReportGet', 'baseReportGetRequest', baseReportGetRequest) + const localVarPath = `/cra/base_report/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -47397,7 +47941,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(bankTransferSweepListRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(baseReportGetRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -47405,16 +47949,16 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * This endpoint allows the customer to retrieve a Base Report. Customers should pass in the `user_token` created in `/link/token/create`. - * @summary Retrieve a Base Report - * @param {BaseReportGetRequest} baseReportGetRequest + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ - baseReportGet: async (baseReportGetRequest: BaseReportGetRequest, options: any = {}): Promise => { - // verify required parameter 'baseReportGetRequest' is not null or undefined - assertParamExists('baseReportGet', 'baseReportGetRequest', baseReportGetRequest) - const localVarPath = `/cra/base_report/get`; + beaconDuplicateGet: async (beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options: any = {}): Promise => { + // verify required parameter 'beaconDuplicateGetRequest' is not null or undefined + assertParamExists('beaconDuplicateGet', 'beaconDuplicateGetRequest', beaconDuplicateGetRequest) + const localVarPath = `/beacon/duplicate/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -47442,7 +47986,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(baseReportGetRequest, localVarRequestOptions, configuration) + localVarRequestOptions.data = serializeDataIfNeeded(beaconDuplicateGetRequest, localVarRequestOptions, configuration) return { url: toPathString(localVarUrlObj), @@ -49555,9 +50099,54 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate: async (identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options: any = {}): Promise => { + // verify required parameter 'identityVerificationAutofillCreateRequest' is not null or undefined + assertParamExists('identityVerificationAutofillCreate', 'identityVerificationAutofillCreateRequest', identityVerificationAutofillCreateRequest) + const localVarPath = `/identity_verification/autofill/create`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(identityVerificationAutofillCreateRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -49601,7 +50190,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -49691,7 +50280,7 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration }; }, /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -52210,6 +52799,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet: async (processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options: any = {}): Promise => { + // verify required parameter 'processorLiabilitiesGetRequest' is not null or undefined + assertParamExists('processorLiabilitiesGet', 'processorLiabilitiesGetRequest', processorLiabilitiesGetRequest) + const localVarPath = `/processor/liabilities/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(processorLiabilitiesGetRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -54100,6 +54734,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh: async (statementsRefreshRequest: StatementsRefreshRequest, options: any = {}): Promise => { + // verify required parameter 'statementsRefreshRequest' is not null or undefined + assertParamExists('statementsRefresh', 'statementsRefreshRequest', statementsRefreshRequest) + const localVarPath = `/statements/refresh`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(statementsRefreshRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -57749,6 +58428,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.baseReportGet(baseReportGetRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.beaconDuplicateGet(beaconDuplicateGetRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -58266,9 +58956,20 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.identityRefresh(identityRefreshRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -58278,7 +58979,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -58300,7 +59001,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -58915,6 +59616,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.processorIdentityMatch(processorIdentityMatchRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async processorLiabilitiesGet(processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.processorLiabilitiesGet(processorLiabilitiesGetRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -59377,6 +60089,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.statementsList(statementsListRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async statementsRefresh(statementsRefreshRequest: StatementsRefreshRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.statementsRefresh(statementsRefreshRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -60452,6 +61175,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath baseReportGet(baseReportGetRequest: BaseReportGetRequest, options?: any): AxiosPromise { return localVarFp.baseReportGet(baseReportGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): AxiosPromise { + return localVarFp.beaconDuplicateGet(beaconDuplicateGetRequest, options).then((request) => request(axios, basePath)); + }, /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -60922,9 +61655,19 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath identityRefresh(identityRefreshRequest: IdentityRefreshRequest, options?: any): AxiosPromise { return localVarFp.identityRefresh(identityRefreshRequest, options).then((request) => request(axios, basePath)); }, + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): AxiosPromise { + return localVarFp.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(axios, basePath)); + }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -60933,7 +61676,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.identityVerificationCreate(identityVerificationCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -60953,7 +61696,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath return localVarFp.identityVerificationList(identityVerificationListRequest, options).then((request) => request(axios, basePath)); }, /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -61512,6 +62255,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath processorIdentityMatch(processorIdentityMatchRequest: ProcessorIdentityMatchRequest, options?: any): AxiosPromise { return localVarFp.processorIdentityMatch(processorIdentityMatchRequest, options).then((request) => request(axios, basePath)); }, + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any): AxiosPromise { + return localVarFp.processorLiabilitiesGet(processorLiabilitiesGetRequest, options).then((request) => request(axios, basePath)); + }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -61932,6 +62685,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath statementsList(statementsListRequest: StatementsListRequest, options?: any): AxiosPromise { return localVarFp.statementsList(statementsListRequest, options).then((request) => request(axios, basePath)); }, + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh(statementsRefreshRequest: StatementsRefreshRequest, options?: any): AxiosPromise { + return localVarFp.statementsRefresh(statementsRefreshRequest, options).then((request) => request(axios, basePath)); + }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -62980,6 +63743,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).baseReportGet(baseReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any) { + return PlaidApiFp(this.configuration).beaconDuplicateGet(beaconDuplicateGetRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -63544,9 +64319,21 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).identityRefresh(identityRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any) { + return PlaidApiFp(this.configuration).identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -63557,7 +64344,7 @@ export class PlaidApi extends BaseAPI { } /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -63581,7 +64368,7 @@ export class PlaidApi extends BaseAPI { } /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -64252,6 +65039,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).processorIdentityMatch(processorIdentityMatchRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public processorLiabilitiesGet(processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any) { + return PlaidApiFp(this.configuration).processorLiabilitiesGet(processorLiabilitiesGetRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -64756,6 +65555,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).statementsList(statementsListRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public statementsRefresh(statementsRefreshRequest: StatementsRefreshRequest, options?: any) { + return PlaidApiFp(this.configuration).statementsRefresh(statementsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data diff --git a/base.ts b/base.ts index 5c56eb71..ea61e716 100644 --- a/base.ts +++ b/base.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/common.ts b/common.ts index dd3cbfcb..852f9e21 100644 --- a/common.ts +++ b/common.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/configuration.ts b/configuration.ts index d8337293..ad6ebcc8 100644 --- a/configuration.ts +++ b/configuration.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -97,7 +97,7 @@ export class Configuration { if(!this.baseOptions) this.baseOptions = {}; if(!this.baseOptions.headers) this.baseOptions.headers = {}; this.baseOptions.headers = { - ['User-Agent']: `Plaid Node v18.2.0`, + ['User-Agent']: `Plaid Node v18.3.0`, ['Plaid-Version']: '2020-09-14', ...this.baseOptions.headers, } diff --git a/dist/api.d.ts b/dist/api.d.ts index be0eb28a..68fe73b3 100644 --- a/dist/api.d.ts +++ b/dist/api.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -145,7 +145,7 @@ export interface AccountAssets { */ verification_status?: AccountAssetsVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountAssets */ @@ -281,7 +281,7 @@ export interface AccountBalance { */ unofficial_currency_code: string | null; /** - * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time that the balance for the given account has been updated This is currently only provided when the `min_last_updated_datetime` is passed when calling `/accounts/balance/get` for `ins_128026` (Capital One). + * Timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the oldest acceptable balance when making a request to `/accounts/balance/get`. This field is only used and expected when the institution is `ins_128026` (Capital One) and the Item contains one or more accounts with a non-depository account type, in which case a value must be provided or an `INVALID_REQUEST` error with the code of `INVALID_FIELD` will be returned. For Capital One depository accounts as well as all other account types on all other institutions, this field is ignored. See [account type schema](https://en.wikipedia.org/wiki/ISO_8601) for a full list of account types. If the balance that is pulled is older than the given timestamp for Items with this field required, an `INVALID_REQUEST` error with the code of `LAST_UPDATED_DATETIME_OUT_OF_RANGE` will be returned with the most recent timestamp for the requested account contained in the response. * @type {string} * @memberof AccountBalance */ @@ -343,7 +343,7 @@ export interface AccountBase { */ verification_status?: AccountBaseVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountBase */ @@ -480,7 +480,7 @@ export interface AccountIdentity { */ verification_status?: AccountIdentityVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountIdentity */ @@ -585,7 +585,7 @@ export interface AccountIdentityMatchScore { */ verification_status?: AccountIdentityMatchScoreVerificationStatusEnum; /** - * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently an opt-in field and only supported for Chase Items. + * A unique and persistent identifier for accounts that can be used to trace multiple instances of the same account across different Items for depository accounts. This is currently only supported for Chase Items. * @type {string} * @memberof AccountIdentityMatchScore */ @@ -4591,7 +4591,7 @@ export interface BaseReportAccountBalances { */ unofficial_currency_code: string | null; /** - * Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time that the balance for the given account has been updated This is currently only provided when the `min_last_updated_datetime` is passed when calling `/accounts/balance/get` for `ins_128026` (Capital One). + * Timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the oldest acceptable balance when making a request to `/accounts/balance/get`. This field is only used and expected when the institution is `ins_128026` (Capital One) and the Item contains one or more accounts with a non-depository account type, in which case a value must be provided or an `INVALID_REQUEST` error with the code of `INVALID_FIELD` will be returned. For Capital One depository accounts as well as all other account types on all other institutions, this field is ignored. See [account type schema](https://en.wikipedia.org/wiki/ISO_8601) for a full list of account types. If the balance that is pulled is older than the given timestamp for Items with this field required, an `INVALID_REQUEST` error with the code of `LAST_UPDATED_DATETIME_OUT_OF_RANGE` will be returned with the most recent timestamp for the requested account contained in the response. * @type {string} * @memberof BaseReportAccountBalances */ @@ -5143,6 +5143,119 @@ export interface BeaconDuplicateDetectedWebhook { */ environment: WebhookEnvironmentValues; } +/** + * Request input for getting a Beacon Duplicate + * @export + * @interface BeaconDuplicateGetRequest + */ +export interface BeaconDuplicateGetRequest { + /** + * ID of the associated Beacon Duplicate. + * @type {string} + * @memberof BeaconDuplicateGetRequest + */ + beacon_duplicate_id: string; + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof BeaconDuplicateGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof BeaconDuplicateGetRequest + */ + secret?: string; +} +/** + * A Beacon Duplicate represents a pair of matching Beacon Users and an analysis of the fields they matched on. + * @export + * @interface BeaconDuplicateGetResponse + */ +export interface BeaconDuplicateGetResponse { + [key: string]: object | unknown; + /** + * ID of the associated Beacon Duplicate. + * @type {string} + * @memberof BeaconDuplicateGetResponse + */ + id: string; + /** + * + * @type {BeaconUserRevision} + * @memberof BeaconDuplicateGetResponse + */ + beacon_user1: BeaconUserRevision; + /** + * + * @type {BeaconUserRevision} + * @memberof BeaconDuplicateGetResponse + */ + beacon_user2: BeaconUserRevision; + /** + * + * @type {BeaconMatchSummaryAnalysis} + * @memberof BeaconDuplicateGetResponse + */ + analysis: BeaconMatchSummaryAnalysis; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof BeaconDuplicateGetResponse + */ + request_id: string; +} +/** + * Analysis of which fields matched between one Beacon User and another. + * @export + * @interface BeaconMatchSummaryAnalysis + */ +export interface BeaconMatchSummaryAnalysis { + [key: string]: object | unknown; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + address: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + date_of_birth: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + email_address: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + name: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + id_number: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + ip_address: BeaconMatchSummaryCode; + /** + * + * @type {BeaconMatchSummaryCode} + * @memberof BeaconMatchSummaryAnalysis + */ + phone_number: BeaconMatchSummaryCode; +} /** * An enum indicating the match type between two Beacon Users. `match` indicates that the provided input data was a strong match against the other Beacon User. `partial_match` indicates the data approximately matched the other Beacon User. For example, \"Knope\" vs. \"Knope-Wyatt\" for last name. `no_match` indicates that Plaid was able to compare this field against the other Beacon User and it did not match the provided input data. `no_data` indicates that Plaid was unable to compare this field against the original Beacon User because the field was not present in one of the Beacon Users. * @export @@ -5779,7 +5892,7 @@ export interface BeaconReportUpdatedWebhook { export interface BeaconUserAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof BeaconUserAddress */ @@ -6119,7 +6232,7 @@ export interface BeaconUserNameNullable { export interface BeaconUserRequestAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof BeaconUserRequestAddress */ @@ -6163,7 +6276,7 @@ export interface BeaconUserRequestAddress { export interface BeaconUserRequestAddressNullable { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof BeaconUserRequestAddressNullable */ @@ -6280,6 +6393,26 @@ export interface BeaconUserReviewRequest { */ secret?: string; } +/** + * A Beacon User Revision identifies a Beacon User at some point in its revision history. + * @export + * @interface BeaconUserRevision + */ +export interface BeaconUserRevision { + [key: string]: object | unknown; + /** + * ID of the associated Beacon User. + * @type {string} + * @memberof BeaconUserRevision + */ + id: string; + /** + * The `version` field begins with 1 and increments with each subsequent revision. + * @type {number} + * @memberof BeaconUserRevision + */ + version: number; +} /** * A status of a Beacon User. `rejected`: The Beacon User has been rejected for fraud. Users can be automatically or manually rejected. `pending_review`: The Beacon User has been marked for review. `cleared`: The Beacon User has been cleared of fraud. * @export @@ -14917,7 +15050,7 @@ export interface Holding { */ institution_value: number; /** - * The original total value of the holding. This field is calculated by Plaid as the sum of the purchase price of all of the shares in the holding. + * The total cost basis of the holding (e.g., the total amount spent to acquire all assets currently in the holding). * @type {number} * @memberof Holding */ @@ -15010,7 +15143,7 @@ export interface HoldingsOverride { */ institution_price_as_of?: string; /** - * The average original value of the holding. Multiple cost basis values for the same security purchased at different prices are not supported. + * The total cost basis of the holding (e.g., the total amount spent to acquire all assets currently in the holding). * @type {number} * @memberof HoldingsOverride */ @@ -15578,6 +15711,148 @@ export interface IdentityVerification { */ redacted_at: string | null; } +/** + * Even if an address has been autofilled, some fields may be null depending on the region\'s addressing system. For example: Addresses from the United Kingdom will not include a region Addresses from Hong Kong will not include postal code + * @export + * @interface IdentityVerificationAutofillAddress + */ +export interface IdentityVerificationAutofillAddress { + [key: string]: object | unknown; + /** + * The primary street portion of an address. If an address is provided, this field will always be filled. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + street: string; + /** + * Extra street information, like an apartment or suite number. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + street2: string | null; + /** + * City from the end user\'s address + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + city: string | null; + /** + * An ISO 3166-2 subdivision code. Related terms would be \"state\", \"province\", \"prefecture\", \"zone\", \"subdivision\", etc. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + region: string | null; + /** + * The postal code for the associated address. Between 2 and 10 alphanumeric characters. For US-based addresses this must be 5 numeric digits. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + postal_code: string | null; + /** + * Valid, capitalized, two-letter ISO code representing the country of this object. Must be in ISO 3166-1 alpha-2 form. + * @type {string} + * @memberof IdentityVerificationAutofillAddress + */ + country: string; + /** + * + * @type {POBoxStatus} + * @memberof IdentityVerificationAutofillAddress + */ + po_box: POBoxStatus; + /** + * + * @type {AddressPurposeLabel} + * @memberof IdentityVerificationAutofillAddress + */ + type: AddressPurposeLabel; +} +/** + * Request input to autofill an Identity Verification + * @export + * @interface IdentityVerificationAutofillCreateRequest + */ +export interface IdentityVerificationAutofillCreateRequest { + /** + * ID of the associated Identity Verification attempt. + * @type {string} + * @memberof IdentityVerificationAutofillCreateRequest + */ + identity_verification_id: string; + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof IdentityVerificationAutofillCreateRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof IdentityVerificationAutofillCreateRequest + */ + secret?: string; +} +/** + * Autofill represents unverified customer information. This needs to be confirmed by the customer before using. + * @export + * @interface IdentityVerificationAutofillCreateResponse + */ +export interface IdentityVerificationAutofillCreateResponse { + [key: string]: object | unknown; + /** + * + * @type {IdentityVerificationAutofillStatus} + * @memberof IdentityVerificationAutofillCreateResponse + */ + status: IdentityVerificationAutofillStatus; + /** + * + * @type {IdentityVerificationAutofillUserData} + * @memberof IdentityVerificationAutofillCreateResponse + */ + user: IdentityVerificationAutofillUserData | null; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof IdentityVerificationAutofillCreateResponse + */ + request_id: string; +} +/** + * A status enum indicating whether autofill succeeded or failed. + * @export + * @enum {string} + */ +export declare enum IdentityVerificationAutofillStatus { + Success = "success", + Failed = "failed" +} +/** + * User information that was autofilled. All this information should be confirmed by the user before using. + * @export + * @interface IdentityVerificationAutofillUserData + */ +export interface IdentityVerificationAutofillUserData { + [key: string]: object | unknown; + /** + * + * @type {IdentityVerificationResponseUserName} + * @memberof IdentityVerificationAutofillUserData + */ + name: IdentityVerificationResponseUserName | null; + /** + * + * @type {IdentityVerificationAutofillAddress} + * @memberof IdentityVerificationAutofillUserData + */ + address: IdentityVerificationAutofillAddress | null; + /** + * + * @type {UserIDNumber} + * @memberof IdentityVerificationAutofillUserData + */ + id_number: UserIDNumber | null; +} /** * Request schema for \'/identity_verification/create\' * @export @@ -15832,7 +16107,7 @@ export interface IdentityVerificationDocumentAddressResponse { country: string; } /** - * Request input for fetching an identity verification + * Request input for fetching an Identity Verification * @export * @interface IdentityVerificationGetRequest */ @@ -15967,7 +16242,7 @@ export interface IdentityVerificationGetResponse { request_id: string; } /** - * Request input for listing identity verifications + * Request input for listing Identity Verifications * @export * @interface IdentityVerificationListRequest */ @@ -16380,7 +16655,7 @@ export interface IdentityVerificationStatusUpdatedWebhook { environment: WebhookEnvironmentValues; } /** - * The status of a step in the identity verification process. + * The status of a step in the Identity Verification process. * @export * @enum {string} */ @@ -16480,7 +16755,7 @@ export interface IdentityVerificationStepUpdatedWebhook { environment: WebhookEnvironmentValues; } /** - * The resource ID and version number of the template configuring the behavior of a given identity verification. + * The resource ID and version number of the template configuring the behavior of a given Identity Verification. * @export * @interface IdentityVerificationTemplateReference */ @@ -16507,7 +16782,7 @@ export interface IdentityVerificationTemplateReference { export interface IdentityVerificationUserAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof IdentityVerificationUserAddress */ @@ -16544,7 +16819,7 @@ export interface IdentityVerificationUserAddress { country: string; } /** - * The identity data that was either collected from the user or provided via API in order to perform an identity verification. + * The identity data that was either collected from the user or provided via API in order to perform an Identity Verification. * @export * @interface IdentityVerificationUserData */ @@ -21499,7 +21774,7 @@ export interface LinkTokenCreateHostedLink { */ export interface LinkTokenCreateInstitutionData { /** - * The routing number of the bank to highlight. + * The routing number of the bank to highlight in Link. Note: in rare cases, a single routing number can be associated with multiple institutions, e.g. due to a brokerage using another institution to manage ACH on its sweep accounts. If this happens, the bank will not be highlighted in Link even if the routing number is provided. * @type {string} * @memberof LinkTokenCreateInstitutionData */ @@ -24738,11 +25013,11 @@ export interface PayPeriodDetails { */ pay_date?: string | null; /** - * The frequency at which an individual is paid. - * @type {string} + * + * @type {PayPeriodDetailsPayFrequency} * @memberof PayPeriodDetails */ - pay_frequency?: PayPeriodDetailsPayFrequencyEnum; + pay_frequency?: PayPeriodDetailsPayFrequency | null; /** * The date on which the paystub was issued, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (\"yyyy-mm-dd\"). * @type {string} @@ -24758,10 +25033,11 @@ export interface PayPeriodDetails { start_date?: string | null; } /** - * @export - * @enum {string} - */ -export declare enum PayPeriodDetailsPayFrequencyEnum { + * The frequency at which an individual is paid. + * @export + * @enum {string} + */ +export declare enum PayPeriodDetailsPayFrequency { PayFrequencyUnknown = "PAY_FREQUENCY_UNKNOWN", PayFrequencyWeekly = "PAY_FREQUENCY_WEEKLY", PayFrequencyBiweekly = "PAY_FREQUENCY_BIWEEKLY", @@ -25858,7 +26134,7 @@ export interface PaymentInitiationPaymentCreateRequest { */ recipient_id: string; /** - * A reference for the payment. This must be an alphanumeric string with at most 18 characters and must not contain any special characters (since not all institutions support them). In order to track settlement via Payment Confirmation, each payment must have a unique reference. If the reference provided through the API is not unique, Plaid will adjust it. Both the originally provided and automatically adjusted references (if any) can be found in the `reference` and `adjusted_reference` fields, respectively. + * A reference for the payment. This must be an alphanumeric string with at most 18 characters and must not contain any special characters (since not all institutions support them). In order to track settlement via Payment Confirmation, each payment must have a unique reference. If the reference provided through the API is not unique, Plaid will adjust it. Some institutions may limit the reference to less than 18 characters. If necessary, Plaid will adjust the reference by truncating it to fit the institution\'s requirements. Both the originally provided and automatically adjusted references (if any) can be found in the `reference` and `adjusted_reference` fields, respectively. * @type {string} * @memberof PaymentInitiationPaymentCreateRequest */ @@ -27235,10 +27511,54 @@ export interface PaystubOverride { income_breakdown?: Array; /** * - * @type {PayPeriodDetails} + * @type {PaystubOverridePayPeriodDetails} * @memberof PaystubOverride */ - pay_period_details?: PayPeriodDetails; + pay_period_details?: PaystubOverridePayPeriodDetails; +} +/** + * Information about the accounts that the payment was distributed to. + * @export + * @interface PaystubOverrideDistributionBreakdown + */ +export interface PaystubOverrideDistributionBreakdown { + [key: string]: object | unknown; + /** + * Name of the account for the given distribution. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + account_name?: string | null; + /** + * The name of the bank that the payment is being deposited to. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + bank_name?: string | null; + /** + * The amount distributed to this account. + * @type {number} + * @memberof PaystubOverrideDistributionBreakdown + */ + current_amount?: number | null; + /** + * The ISO-4217 currency code of the net pay. Always `null` if `unofficial_currency_code` is non-null. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + currency?: string | null; + /** + * The last 2-4 alphanumeric characters of an account\'s official account number. + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + mask?: string | null; + /** + * Type of the account that the paystub was sent to (e.g. \'checking\'). + * @type {string} + * @memberof PaystubOverrideDistributionBreakdown + */ + type?: string | null; } /** * The employee on the paystub. @@ -27309,6 +27629,63 @@ export interface PaystubOverrideEmployer { */ name?: string; } +/** + * Details about the pay period. + * @export + * @interface PaystubOverridePayPeriodDetails + */ +export interface PaystubOverridePayPeriodDetails { + [key: string]: object | unknown; + /** + * The amount of the paycheck. + * @type {number} + * @memberof PaystubOverridePayPeriodDetails + */ + check_amount?: number | null; + /** + * + * @type {Array} + * @memberof PaystubOverridePayPeriodDetails + */ + distribution_breakdown?: Array; + /** + * The pay period end date, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format: \"yyyy-mm-dd\". + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + */ + end_date?: string | null; + /** + * Total earnings before tax/deductions. + * @type {number} + * @memberof PaystubOverridePayPeriodDetails + */ + gross_earnings?: number | null; + /** + * The date on which the paystub was issued, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (\"yyyy-mm-dd\"). + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + */ + pay_date?: string | null; + /** + * + * @type {PayPeriodDetailsPayFrequency} + * @memberof PaystubOverridePayPeriodDetails + */ + pay_frequency?: PayPeriodDetailsPayFrequency | null; + /** + * The date on which the paystub was issued, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (\"yyyy-mm-dd\"). + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + * @deprecated + */ + pay_day?: string | null; + /** + * The pay period start date, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format: \"yyyy-mm-dd\". + * @type {string} + * @memberof PaystubOverridePayPeriodDetails + */ + start_date?: string | null; +} /** * The frequency at which the employee is paid. Possible values: `MONTHLY`, `BI-WEEKLY`, `WEEKLY`, `SEMI-MONTHLY`. * @export @@ -28240,6 +28617,57 @@ export interface ProcessorInitialUpdateWebhook { */ environment: WebhookEnvironmentValues; } +/** + * ProcessorLiabilitiesGetRequest defines the request schema for `/processor/liabilities/get` + * @export + * @interface ProcessorLiabilitiesGetRequest + */ +export interface ProcessorLiabilitiesGetRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof ProcessorLiabilitiesGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof ProcessorLiabilitiesGetRequest + */ + secret?: string; + /** + * The processor token obtained from the Plaid integration partner. Processor tokens are in the format: `processor--` + * @type {string} + * @memberof ProcessorLiabilitiesGetRequest + */ + processor_token: string; +} +/** + * ProcessorLiabilitiesGetResponse defines the response schema for `/processor/liabilities/get` + * @export + * @interface ProcessorLiabilitiesGetResponse + */ +export interface ProcessorLiabilitiesGetResponse { + [key: string]: object | unknown; + /** + * + * @type {AccountBase} + * @memberof ProcessorLiabilitiesGetResponse + */ + account: AccountBase; + /** + * + * @type {LiabilitiesObject} + * @memberof ProcessorLiabilitiesGetResponse + */ + liabilities: LiabilitiesObject; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof ProcessorLiabilitiesGetResponse + */ + request_id: string; +} /** * An object containing identifying numbers used for making electronic transfers to and from the `account`. The identifying number type (ACH, EFT, IBAN, or BACS) used will depend on the country of the account. An account may have more than one number type. If a particular identifying number type is not used by the `account` for which auth data has been requested, a null value will be returned. * @export @@ -30607,6 +31035,25 @@ export interface RiskCheckSyntheticIdentity { */ score: number; } +/** + * Details about the transaction result after evaluated by the requested risk profile. If a `risk_profile_key` is not provided, this field will be omitted. This feature is currently in closed beta; to request access, contact your account manager. + * @export + * @interface RiskProfile + */ +export interface RiskProfile { + /** + * The name of the risk profile used for this transaction. + * @type {string} + * @memberof RiskProfile + */ + key?: string; + /** + * The name of the evaluated outcome for this transaction. + * @type {string} + * @memberof RiskProfile + */ + outcome?: string; +} /** * Object containing metadata for the document * @export @@ -33226,6 +33673,12 @@ export interface SignalEvaluateRequest { * @memberof SignalEvaluateRequest */ device?: SignalDevice; + /** + * The name of the risk profile to use for this transaction. A risk profile can be configured using via the Plaid Dashboard. If not provided, no risk profile will be used. This feature is currently in closed beta; to request access, contact your account manager. + * @type {string} + * @memberof SignalEvaluateRequest + */ + risk_profile_key?: string | null; } /** * SignalEvaluateResponse defines the response schema for `/signal/income/evaluate` @@ -33252,6 +33705,12 @@ export interface SignalEvaluateResponse { * @memberof SignalEvaluateResponse */ core_attributes?: SignalEvaluateCoreAttributes; + /** + * + * @type {RiskProfile} + * @memberof SignalEvaluateResponse + */ + risk_profile?: RiskProfile | null; /** * If bank information was not available to be used in the Signal model, this array contains warnings describing why bank data is missing. If you want to receive an API error instead of Signal scores in the case of missing bank data, file a support ticket or contact your Plaid account manager. * @type {Array} @@ -33694,6 +34153,12 @@ export interface StatementsAccount { * @memberof StatementsAccount */ account_id: string; + /** + * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * @type {string} + * @memberof StatementsAccount + */ + account_mask: string; /** * The name of the account, either assigned by the user or by the financial institution itself. * @type {string} @@ -33701,7 +34166,19 @@ export interface StatementsAccount { */ account_name: string; /** - * The type of account. Possible values are investment, credit, depository, loan, brokerage, other. + * The official name of the account as given by the financial institution. + * @type {string} + * @memberof StatementsAccount + */ + account_official_name: string; + /** + * The subtype of the account. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). + * @type {string} + * @memberof StatementsAccount + */ + account_subtype: string; + /** + * The type of account. For a full list of valid types and subtypes, see the [Account schema](https://plaid.com/docs/api/accounts#account-type-schema). * @type {string} * @memberof StatementsAccount */ @@ -40584,7 +41061,7 @@ export interface UserAccountRevokedWebhook { export interface UserAddress { [key: string]: object | unknown; /** - * The primary street portion of an address. If the user has submitted their address, this field will always be filled. + * The primary street portion of an address. If an address is provided, this field will always be filled. * @type {string} * @memberof UserAddress */ @@ -44387,6 +44864,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ baseReportGet: (baseReportGetRequest: BaseReportGetRequest, options?: any) => Promise; + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet: (beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any) => Promise; /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -44767,16 +45252,24 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ identityRefresh: (identityRefreshRequest: IdentityRefreshRequest, options?: any) => Promise; + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate: (identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any) => Promise; /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationCreate: (identityVerificationCreateRequest: IdentityVerificationCreateRequest, options?: any) => Promise; /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -44792,7 +45285,7 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | */ identityVerificationList: (identityVerificationListRequest: IdentityVerificationListRequest, options?: any) => Promise; /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -45239,6 +45732,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ processorIdentityMatch: (processorIdentityMatchRequest: ProcessorIdentityMatchRequest, options?: any) => Promise; + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet: (processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any) => Promise; /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -45575,6 +46076,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ statementsList: (statementsListRequest: StatementsListRequest, options?: any) => Promise; + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh: (statementsRefreshRequest: StatementsRefreshRequest, options?: any) => Promise; /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -46375,6 +46884,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ baseReportGet(baseReportGetRequest: BaseReportGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -46755,16 +47272,24 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ identityRefresh(identityRefreshRequest: IdentityRefreshRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationCreate(identityVerificationCreateRequest: IdentityVerificationCreateRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -46780,7 +47305,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => */ identityVerificationList(identityVerificationListRequest: IdentityVerificationListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -47227,6 +47752,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ processorIdentityMatch(processorIdentityMatchRequest: ProcessorIdentityMatchRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -47565,6 +48098,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ statementsList(statementsListRequest: StatementsListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh(statementsRefreshRequest: StatementsRefreshRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -48365,6 +48906,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ baseReportGet(baseReportGetRequest: BaseReportGetRequest, options?: any): AxiosPromise; + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): AxiosPromise; /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -48745,16 +49294,24 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ identityRefresh(identityRefreshRequest: IdentityRefreshRequest, options?: any): AxiosPromise; + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): AxiosPromise; /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationCreate(identityVerificationCreateRequest: IdentityVerificationCreateRequest, options?: any): AxiosPromise; /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -48770,7 +49327,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined */ identityVerificationList(identityVerificationListRequest: IdentityVerificationListRequest, options?: any): AxiosPromise; /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -49217,6 +49774,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ processorIdentityMatch(processorIdentityMatchRequest: ProcessorIdentityMatchRequest, options?: any): AxiosPromise; + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any): AxiosPromise; /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -49555,6 +50120,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ statementsList(statementsListRequest: StatementsListRequest, options?: any): AxiosPromise; + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh(statementsRefreshRequest: StatementsRefreshRequest, options?: any): AxiosPromise; /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -50381,6 +50954,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ baseReportGet(baseReportGetRequest: BaseReportGetRequest, options?: any): Promise>; + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + beaconDuplicateGet(beaconDuplicateGetRequest: BeaconDuplicateGetRequest, options?: any): Promise>; /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -50808,9 +51390,18 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ identityRefresh(identityRefreshRequest: IdentityRefreshRequest, options?: any): Promise>; + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest: IdentityVerificationAutofillCreateRequest, options?: any): Promise>; /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -50818,7 +51409,7 @@ export declare class PlaidApi extends BaseAPI { */ identityVerificationCreate(identityVerificationCreateRequest: IdentityVerificationCreateRequest, options?: any): Promise>; /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -50836,7 +51427,7 @@ export declare class PlaidApi extends BaseAPI { */ identityVerificationList(identityVerificationListRequest: IdentityVerificationListRequest, options?: any): Promise>; /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -51339,6 +51930,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ processorIdentityMatch(processorIdentityMatchRequest: ProcessorIdentityMatchRequest, options?: any): Promise>; + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest: ProcessorLiabilitiesGetRequest, options?: any): Promise>; /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -51719,6 +52319,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ statementsList(statementsListRequest: StatementsListRequest, options?: any): Promise>; + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + statementsRefresh(statementsRefreshRequest: StatementsRefreshRequest, options?: any): Promise>; /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data diff --git a/dist/api.js b/dist/api.js index 4b0d7dc3..f04942be 100644 --- a/dist/api.js +++ b/dist/api.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -26,10 +26,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DepositSwitchAltCreateRequestCountryCodeEnum = exports.DashboardUserStatus = exports.CreditSessionBankIncomeStatus = exports.CreditSessionBankEmploymentStatus = exports.CreditPayStubPayBasisType = exports.CreditBankIncomeWarningType = exports.CreditBankIncomeWarningCode = exports.CreditBankIncomePayFrequency = exports.CreditBankIncomeErrorType = exports.CreditBankIncomeCategory = exports.CreditBankIncomeAccountType = exports.CreditBankEmploymentWarningType = exports.CreditAccountSubtype = exports.CreditACHClass = exports.CraBankIncomeWarningCode = exports.CraBankIncomeCompleteResult = exports.CountryCode = exports.CounterpartyType = exports.ConsumerReportPermissiblePurpose = exports.BeaconUserStatus = exports.BeaconReportType = exports.BeaconMatchSummaryCode = exports.BeaconAuditTrailSource = exports.BaseReportWarningCode = exports.BankTransferType = exports.BankTransferStatus = exports.BankTransferNetwork = exports.BankTransferEventType = exports.BankTransferEventListDirection = exports.BankTransferEventListBankTransferType = exports.BankTransferDirection = exports.BankIncomeRefreshCompleteResult = exports.BankIncomeCompleteResult = exports.AssetType = exports.AssetTransactionType = exports.AssetTransactionCategoryType = exports.AssetReportTransactionType = exports.AssetReportAddOns = exports.AddressPurposeLabel = exports.ActivityType = exports.ActionState = exports.AccountType = exports.AccountSubtype = exports.AccountSelectionCardinality = exports.AccountIdentityMatchScoreVerificationStatusEnum = exports.AccountIdentityVerificationStatusEnum = exports.AccountBaseVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum = exports.APRAprTypeEnum = exports.ACHClass = void 0; -exports.LinkDeliveryVerificationStatus = exports.LinkDeliverySessionStatus = exports.LinkDeliveryDeliveryMethod = exports.ItemUpdateTypeEnum = exports.IssuingCountry = exports.InvestmentTransactionType = exports.InvestmentTransactionSubtype = exports.InvestmentAccountSubtype = exports.IndividualWatchlistCode = exports.IncomeVerificationSourceType = exports.IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPayrollFlowType = exports.IncomeVerificationDocParsingConfig = exports.IncomeBreakdownType = exports.IncidentUpdateStatusEnum = exports.ImageQuality = exports.IdentityVerificationStepStatus = exports.IdentityVerificationStatus = exports.IdentityUpdateTypes = exports.ISOCurrencyCode = exports.IDNumberType = exports.HostedLinkDeliveryMethod = exports.Form1099Type = exports.FDXPartyType = exports.FDXPartyRegistry = exports.FDXNotificationType = exports.FDXNotificationSeverity = exports.FDXNotificationPriority = exports.FDXNotificationPayloadIdType = exports.FDXNotificationCategory = exports.FDXHateoasLinkAction = exports.FDXContentTypes = exports.ExpirationDate = exports.EntityWatchlistCode = exports.EntityDocumentType = exports.EnrichTransactionDirection = exports.EmploymentVerificationStatus = exports.EmploymentSourceType = exports.EmailTypeEnum = exports.EarningsBreakdownCanonicalDescription = exports.DocumentStatus = exports.DocumentNameMatchCode = exports.DocumentDateOfBirthMatchCode = exports.DocumentAuthenticityMatchCode = exports.DocType = exports.DepositoryAccountSubtype = exports.DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseStateEnum = exports.DepositSwitchCreateRequestCountryCodeEnum = void 0; -exports.RiskCheckBehaviorBotDetectedLabel = exports.ReportType = exports.RecurringTransactionFrequency = exports.RecurringFrequency = exports.ProxyType = exports.ProgramNameSensitivity = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequencyEnum = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.POBoxStatus = exports.OwnershipType = exports.OverrideAccountType = exports.OtherAccountSubtype = exports.OriginatorExpectedTransferFrequency = exports.OmittableTransferType = exports.MatchSummaryCode = exports.LoanIdentifierType = exports.LoanAccountSubtype = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkSessionSuccessMetadataTransferStatus = exports.LinkEventName = exports.LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCallbackType = void 0; -exports.TransferEventType = exports.TransferEventListTransferType = exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisDocumentComparison = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.RiskSignalDocumentStatus = exports.RiskCheckLinkedService = exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = void 0; -exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.WebhookType = exports.WebhookEnvironmentValues = exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = void 0; +exports.LinkDeliverySessionStatus = exports.LinkDeliveryDeliveryMethod = exports.ItemUpdateTypeEnum = exports.IssuingCountry = exports.InvestmentTransactionType = exports.InvestmentTransactionSubtype = exports.InvestmentAccountSubtype = exports.IndividualWatchlistCode = exports.IncomeVerificationSourceType = exports.IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPayrollFlowType = exports.IncomeVerificationDocParsingConfig = exports.IncomeBreakdownType = exports.IncidentUpdateStatusEnum = exports.ImageQuality = exports.IdentityVerificationStepStatus = exports.IdentityVerificationStatus = exports.IdentityVerificationAutofillStatus = exports.IdentityUpdateTypes = exports.ISOCurrencyCode = exports.IDNumberType = exports.HostedLinkDeliveryMethod = exports.Form1099Type = exports.FDXPartyType = exports.FDXPartyRegistry = exports.FDXNotificationType = exports.FDXNotificationSeverity = exports.FDXNotificationPriority = exports.FDXNotificationPayloadIdType = exports.FDXNotificationCategory = exports.FDXHateoasLinkAction = exports.FDXContentTypes = exports.ExpirationDate = exports.EntityWatchlistCode = exports.EntityDocumentType = exports.EnrichTransactionDirection = exports.EmploymentVerificationStatus = exports.EmploymentSourceType = exports.EmailTypeEnum = exports.EarningsBreakdownCanonicalDescription = exports.DocumentStatus = exports.DocumentNameMatchCode = exports.DocumentDateOfBirthMatchCode = exports.DocumentAuthenticityMatchCode = exports.DocType = exports.DepositoryAccountSubtype = exports.DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseStateEnum = exports.DepositSwitchCreateRequestCountryCodeEnum = void 0; +exports.ReportType = exports.RecurringTransactionFrequency = exports.RecurringFrequency = exports.ProxyType = exports.ProgramNameSensitivity = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequency = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.POBoxStatus = exports.OwnershipType = exports.OverrideAccountType = exports.OtherAccountSubtype = exports.OriginatorExpectedTransferFrequency = exports.OmittableTransferType = exports.MatchSummaryCode = exports.LoanIdentifierType = exports.LoanAccountSubtype = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkSessionSuccessMetadataTransferStatus = exports.LinkEventName = exports.LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCallbackType = exports.LinkDeliveryVerificationStatus = void 0; +exports.TransferEventListTransferType = exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisDocumentComparison = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.RiskSignalDocumentStatus = exports.RiskCheckLinkedService = exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel = void 0; +exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.WebhookType = exports.WebhookEnvironmentValues = exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = exports.TransferEventType = void 0; const axios_1 = __importDefault(require("axios")); // Some imports not used depending on template conditions // @ts-ignore @@ -1267,6 +1267,16 @@ var IdentityUpdateTypes; IdentityUpdateTypes["Emails"] = "EMAILS"; IdentityUpdateTypes["Names"] = "NAMES"; })(IdentityUpdateTypes = exports.IdentityUpdateTypes || (exports.IdentityUpdateTypes = {})); +/** + * A status enum indicating whether autofill succeeded or failed. + * @export + * @enum {string} + */ +var IdentityVerificationAutofillStatus; +(function (IdentityVerificationAutofillStatus) { + IdentityVerificationAutofillStatus["Success"] = "success"; + IdentityVerificationAutofillStatus["Failed"] = "failed"; +})(IdentityVerificationAutofillStatus = exports.IdentityVerificationAutofillStatus || (exports.IdentityVerificationAutofillStatus = {})); /** * The status of this Identity Verification attempt. `active` - The Identity Verification attempt is incomplete. The user may have completed part of the session, but has neither failed or passed. `success` - The Identity Verification attempt has completed, passing all steps defined to the associated Identity Verification template `failed` - The user failed one or more steps in the session and was told to contact support. `expired` - The Identity Verification attempt was active for a long period of time without being completed and was automatically marked as expired. Note that sessions currently do not expire. Automatic expiration is expected to be enabled in the future. `canceled` - The Identity Verification attempt was canceled, either via the dashboard by a user, or via API. The user may have completed part of the session, but has neither failed or passed. `pending_review` - The Identity Verification attempt template was configured to perform a screening that had one or more hits needing review. * @export @@ -1282,7 +1292,7 @@ var IdentityVerificationStatus; IdentityVerificationStatus["PendingReview"] = "pending_review"; })(IdentityVerificationStatus = exports.IdentityVerificationStatus || (exports.IdentityVerificationStatus = {})); /** - * The status of a step in the identity verification process. + * The status of a step in the Identity Verification process. * @export * @enum {string} */ @@ -1883,18 +1893,19 @@ var PayFrequencyValue; PayFrequencyValue["Null"] = "null"; })(PayFrequencyValue = exports.PayFrequencyValue || (exports.PayFrequencyValue = {})); /** - * @export - * @enum {string} - */ -var PayPeriodDetailsPayFrequencyEnum; -(function (PayPeriodDetailsPayFrequencyEnum) { - PayPeriodDetailsPayFrequencyEnum["PayFrequencyUnknown"] = "PAY_FREQUENCY_UNKNOWN"; - PayPeriodDetailsPayFrequencyEnum["PayFrequencyWeekly"] = "PAY_FREQUENCY_WEEKLY"; - PayPeriodDetailsPayFrequencyEnum["PayFrequencyBiweekly"] = "PAY_FREQUENCY_BIWEEKLY"; - PayPeriodDetailsPayFrequencyEnum["PayFrequencySemimonthly"] = "PAY_FREQUENCY_SEMIMONTHLY"; - PayPeriodDetailsPayFrequencyEnum["PayFrequencyMonthly"] = "PAY_FREQUENCY_MONTHLY"; - PayPeriodDetailsPayFrequencyEnum["Null"] = "null"; -})(PayPeriodDetailsPayFrequencyEnum = exports.PayPeriodDetailsPayFrequencyEnum || (exports.PayPeriodDetailsPayFrequencyEnum = {})); + * The frequency at which an individual is paid. + * @export + * @enum {string} + */ +var PayPeriodDetailsPayFrequency; +(function (PayPeriodDetailsPayFrequency) { + PayPeriodDetailsPayFrequency["PayFrequencyUnknown"] = "PAY_FREQUENCY_UNKNOWN"; + PayPeriodDetailsPayFrequency["PayFrequencyWeekly"] = "PAY_FREQUENCY_WEEKLY"; + PayPeriodDetailsPayFrequency["PayFrequencyBiweekly"] = "PAY_FREQUENCY_BIWEEKLY"; + PayPeriodDetailsPayFrequency["PayFrequencySemimonthly"] = "PAY_FREQUENCY_SEMIMONTHLY"; + PayPeriodDetailsPayFrequency["PayFrequencyMonthly"] = "PAY_FREQUENCY_MONTHLY"; + PayPeriodDetailsPayFrequency["Null"] = "null"; +})(PayPeriodDetailsPayFrequency = exports.PayPeriodDetailsPayFrequency || (exports.PayPeriodDetailsPayFrequency = {})); /** * The ISO-4217 currency code of the payment. For standing orders and payment consents, `\"GBP\"` must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported. * @export @@ -4196,6 +4207,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet: (beaconDuplicateGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'beaconDuplicateGetRequest' is not null or undefined + common_1.assertParamExists('beaconDuplicateGet', 'beaconDuplicateGetRequest', beaconDuplicateGetRequest); + const localVarPath = `/beacon/duplicate/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconDuplicateGetRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -5882,9 +5929,45 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate: (identityVerificationAutofillCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'identityVerificationAutofillCreateRequest' is not null or undefined + common_1.assertParamExists('identityVerificationAutofillCreate', 'identityVerificationAutofillCreateRequest', identityVerificationAutofillCreateRequest); + const localVarPath = `/identity_verification/autofill/create`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityVerificationAutofillCreateRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -5919,7 +6002,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -5991,7 +6074,7 @@ const PlaidApiAxiosParamCreator = function (configuration) { }; }), /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -8006,6 +8089,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet: (processorLiabilitiesGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'processorLiabilitiesGetRequest' is not null or undefined + common_1.assertParamExists('processorLiabilitiesGet', 'processorLiabilitiesGetRequest', processorLiabilitiesGetRequest); + const localVarPath = `/processor/liabilities/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorLiabilitiesGetRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -9518,6 +9637,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh: (statementsRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'statementsRefreshRequest' is not null or undefined + common_1.assertParamExists('statementsRefresh', 'statementsRefreshRequest', statementsRefreshRequest); + const localVarPath = `/statements/refresh`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(statementsRefreshRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -12540,6 +12695,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet(beaconDuplicateGetRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconDuplicateGet(beaconDuplicateGetRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -13151,9 +13319,22 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -13165,7 +13346,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -13191,7 +13372,7 @@ const PlaidApiFp = function (configuration) { }); }, /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -13918,6 +14099,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.processorLiabilitiesGet(processorLiabilitiesGetRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -14464,6 +14658,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh(statementsRefreshRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.statementsRefresh(statementsRefreshRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -15689,6 +15896,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { baseReportGet(baseReportGetRequest, options) { return localVarFp.baseReportGet(baseReportGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + beaconDuplicateGet(beaconDuplicateGetRequest, options) { + return localVarFp.beaconDuplicateGet(beaconDuplicateGetRequest, options).then((request) => request(axios, basePath)); + }, /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -16159,9 +16376,19 @@ const PlaidApiFactory = function (configuration, basePath, axios) { identityRefresh(identityRefreshRequest, options) { return localVarFp.identityRefresh(identityRefreshRequest, options).then((request) => request(axios, basePath)); }, + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options) { + return localVarFp.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(axios, basePath)); + }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -16170,7 +16397,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.identityVerificationCreate(identityVerificationCreateRequest, options).then((request) => request(axios, basePath)); }, /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -16190,7 +16417,7 @@ const PlaidApiFactory = function (configuration, basePath, axios) { return localVarFp.identityVerificationList(identityVerificationListRequest, options).then((request) => request(axios, basePath)); }, /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -16749,6 +16976,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { processorIdentityMatch(processorIdentityMatchRequest, options) { return localVarFp.processorIdentityMatch(processorIdentityMatchRequest, options).then((request) => request(axios, basePath)); }, + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest, options) { + return localVarFp.processorLiabilitiesGet(processorLiabilitiesGetRequest, options).then((request) => request(axios, basePath)); + }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -17169,6 +17406,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { statementsList(statementsListRequest, options) { return localVarFp.statementsList(statementsListRequest, options).then((request) => request(axios, basePath)); }, + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + statementsRefresh(statementsRefreshRequest, options) { + return localVarFp.statementsRefresh(statementsRefreshRequest, options).then((request) => request(axios, basePath)); + }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -18193,6 +18440,17 @@ class PlaidApi extends base_1.BaseAPI { baseReportGet(baseReportGetRequest, options) { return exports.PlaidApiFp(this.configuration).baseReportGet(baseReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. + * @summary Get a Beacon Duplicate + * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + beaconDuplicateGet(beaconDuplicateGetRequest, options) { + return exports.PlaidApiFp(this.configuration).beaconDuplicateGet(beaconDuplicateGetRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * Create a fraud report for a given Beacon User. Note: If you are creating users with the express purpose of providing historical fraud data, you should use the `/beacon/user/create` endpoint instead and embed the fraud report in the request. This will ensure that the Beacon User you create will not be subject to any billing costs. * @summary Create a Beacon Report @@ -18710,9 +18968,20 @@ class PlaidApi extends base_1.BaseAPI { identityRefresh(identityRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).identityRefresh(identityRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. + * @summary Create autofill for an Identity Verification + * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options) { + return exports.PlaidApiFp(this.configuration).identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. - * @summary Create a new identity verification + * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} @@ -18722,7 +18991,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).identityVerificationCreate(identityVerificationCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Retrieve a previously created identity verification. + * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. @@ -18744,7 +19013,7 @@ class PlaidApi extends base_1.BaseAPI { return exports.PlaidApiFp(this.configuration).identityVerificationList(identityVerificationListRequest, options).then((request) => request(this.axios, this.basePath)); } /** - * Allow a customer to retry their identity verification + * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. @@ -19359,6 +19628,17 @@ class PlaidApi extends base_1.BaseAPI { processorIdentityMatch(processorIdentityMatchRequest, options) { return exports.PlaidApiFp(this.configuration).processorIdentityMatch(processorIdentityMatchRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. + * @summary Retrieve Liabilities data + * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + processorLiabilitiesGet(processorLiabilitiesGetRequest, options) { + return exports.PlaidApiFp(this.configuration).processorLiabilitiesGet(processorLiabilitiesGetRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction @@ -19821,6 +20101,17 @@ class PlaidApi extends base_1.BaseAPI { statementsList(statementsListRequest, options) { return exports.PlaidApiFp(this.configuration).statementsList(statementsListRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. + * @summary Refresh statements data. + * @param {StatementsRefreshRequest} statementsRefreshRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + statementsRefresh(statementsRefreshRequest, options) { + return exports.PlaidApiFp(this.configuration).statementsRefresh(statementsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data @@ -20648,4 +20939,4 @@ class PlaidApi extends base_1.BaseAPI { } } exports.PlaidApi = PlaidApi; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQUU1Rjs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2hCLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7QUFDZixDQUFDLEVBTFcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFLbkI7QUFxQ0Q7OztNQUdNO0FBQ04sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3RCLDZEQUEyQyxDQUFBO0lBQzNDLHNDQUFvQixDQUFBO0lBQ3BCLDhDQUE0QixDQUFBO0lBQzVCLHFDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUt6QjtBQStIRDs7O01BR007QUFDTixJQUFZLG1DQVFYO0FBUkQsV0FBWSxtQ0FBbUM7SUFDM0MsdUZBQWdELENBQUE7SUFDaEQsc0dBQStELENBQUE7SUFDL0QsZ0dBQXlELENBQUE7SUFDekQsNkVBQXNDLENBQUE7SUFDdEMsbUZBQTRDLENBQUE7SUFDNUMsaUZBQTBDLENBQUE7SUFDMUMsMkVBQW9DLENBQUE7QUFDeEMsQ0FBQyxFQVJXLG1DQUFtQyxHQUFuQywyQ0FBbUMsS0FBbkMsMkNBQW1DLFFBUTlDO0FBNkpEOzs7TUFHTTtBQUNOLElBQVksaUNBUVg7QUFSRCxXQUFZLGlDQUFpQztJQUN6QyxxRkFBZ0QsQ0FBQTtJQUNoRCxvR0FBK0QsQ0FBQTtJQUMvRCw4RkFBeUQsQ0FBQTtJQUN6RCwyRUFBc0MsQ0FBQTtJQUN0Qyxp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T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQXA1RkQsNEJBbzVGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4Mi4zXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlLmcuIGJpbGwgcGF5bWVudCAgYFxcXCJ0ZWxcXFwiYCAtIFRlbGVwaG9uZS1Jbml0aWF0ZWQgRW50cnkgIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkgLSBkZWJpdHMgZnJvbSBhIGNvbnN1bWVy4oCZcyBhY2NvdW50IHdoZXJlIHRoZWlyIGF1dGhvcml6YXRpb24gaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBUZWwgPSAndGVsJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBBUFIgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFQUlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW5udWFsIFBlcmNlbnRhZ2UgUmF0ZSBhcHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBhcHJfcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGJhbGFuY2UgdG8gd2hpY2ggdGhlIEFQUiBhcHBsaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl90eXBlOiBBUFJBcHJUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbW9uZXkgdGhhdCBpcyBzdWJqZWN0ZWQgdG8gdGhlIEFQUiBpZiBhIGJhbGFuY2Ugd2FzIGNhcnJpZWQgYmV5b25kIHBheW1lbnQgZHVlIGRhdGUuIEhvdyBpdCBpcyBjYWxjdWxhdGVkIGNhbiB2YXJ5IGJ5IGNhcmQgaXNzdWVyLiBJdCBpcyBvZnRlbiBjYWxjdWxhdGVkIGFzIGFuIGF2ZXJhZ2UgZGFpbHkgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBiYWxhbmNlX3N1YmplY3RfdG9fYXByOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSBjaGFyZ2VkIGR1ZSB0byBpbnRlcmVzdCBmcm9tIGxhc3Qgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGludGVyZXN0X2NoYXJnZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQVBSQXByVHlwZUVudW0ge1xuICAgIEJhbGFuY2VUcmFuc2ZlckFwciA9ICdiYWxhbmNlX3RyYW5zZmVyX2FwcicsXG4gICAgQ2FzaEFwciA9ICdjYXNoX2FwcicsXG4gICAgUHVyY2hhc2VBcHIgPSAncHVyY2hhc2VfYXByJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnXG59XG5cbi8qKlxuICogQWxsb3cgb3IgZGlzYWxsb3cgcHJvZHVjdCBhY2Nlc3MgYnkgYWNjb3VudC4gVW5saXN0ZWQgKGUuZy4gbWlzc2luZykgYWNjb3VudHMgd2lsbCBiZSBjb25zaWRlcmVkIGBuZXdfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QWNjZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMgIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IGFuIG9wdC1pbiBmaWVsZCBhbmQgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogQXNzZXRSZXBvcnRJbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLkZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlPzogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEFzc2V0c1ZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QXNzZXRzQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c0FsbE9mXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0SW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogQXNzZXRSZXBvcnRJbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLkZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIG93bmVycz86IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c0FsbE9mXG4gICAgICovXG4gICAgb3duZXJzaGlwX3R5cGU/OiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEhpc3RvcmljYWxCYWxhbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c0FsbE9mXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlcz86IEFycmF5PEhpc3RvcmljYWxCYWxhbmNlPjtcbn1cbi8qKlxuICogQSBzZXQgb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQuIEJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIGJhbGFuY2Ugb2JqZWN0IHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhbGFuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsdGltZSB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIGBjdXJyZW50YCBpcyBgbnVsbGAgdGhpcyBmaWVsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQgIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgcHJvdmlkZWQgd2hlbiB0aGUgYG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWVgIGlzIHBhc3NlZCB3aGVuIGNhbGxpbmcgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBBdXRvbWF0ZWQgb3IgTWFudWFsIG1pY3JvLWRlcG9zaXRzLiAgUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBOb3RlOiBEYXRhYmFzZSBNYXRjaCBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRCYXNlVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IGFuIG9wdC1pbiBmaWVsZCBhbmQgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRCYXNlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJ1xufVxuXG4vKipcbiAqIEVudW1lcmF0ZXMgdGhlIGFjY291bnQgc3VidHlwZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lzaGVzIGZvciB0aGUgdXNlciB0byBiZSBhYmxlIHRvIHNlbGVjdCBmcm9tLiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHRvIFBsYWlkIGRvY3VtZW50YXRpb24gb24gYWNjb3VudCBmaWx0ZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBgYWNjb3VudF9maWx0ZXJzYCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogSWRlbnRpdHkgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gTm90ZTogRGF0YWJhc2UgTWF0Y2ggaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IGFuIG9wdC1pbiBmaWVsZCBhbmQgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGRvY3VtZW50cyB0aGF0IGlkZW50aXR5IGRhdGEgaXMgZGVydmllZCBmcm9tLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgbm9uZSBvZiB0aGUgYWNjb3VudCBpZGVudGl0eSBpcyBmcm9tIGEgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxJZGVudGl0eURvY3VtZW50Pjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGRvY3VtZW50cyB0aGF0IGlkZW50aXR5IGRhdGEgaXMgZGVydmllZCBmcm9tLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgbm9uZSBvZiB0aGUgYWNjb3VudCBpZGVudGl0eSBpcyBmcm9tIGEgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnQ+O1xufVxuLyoqXG4gKiBJZGVudGl0eSBtYXRjaCBzY29yZXMgZm9yIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IGFuIG9wdC1pbiBmaWVsZCBhbmQgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05hbWVNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmFtZU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IEVtYWlsQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBhY2NvdW50IGRhdGEuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0YXggZG9jdW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0YXhfZG9jdW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IGFjY291bnRzIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBjYXJkaW5hbGl0eS4gYE1VTFRJX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgbXVsdGlwbGUgYWNjb3VudHMuIGBTSU5HTEVfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBvbmx5IGEgc2luZ2xlIGFjY291bnQuIGBBTExgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBtdXN0IHNoYXJlIGFsbCBvZiB0aGVpciBhY2NvdW50cyBhbmQgc2hvdWxkIG5vdCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gZGUtc2VsZWN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U2VsZWN0aW9uQ2FyZGluYWxpdHkge1xuICAgIFNpbmdsZVNlbGVjdCA9ICdTSU5HTEVfU0VMRUNUJyxcbiAgICBNdWx0aVNlbGVjdCA9ICdNVUxUSV9TRUxFQ1QnLFxuICAgIEFsbCA9ICdBTEwnXG59XG5cbi8qKlxuICogU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFN1YnR5cGUge1xuICAgIF80MDFhID0gJzQwMWEnLFxuICAgIF80MDFrID0gJzQwMWsnLFxuICAgIF80MDNCID0gJzQwM0InLFxuICAgIF80NTdiID0gJzQ1N2InLFxuICAgIF81MjkgPSAnNTI5JyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpcmEgPSAnbGlyYScsXG4gICAgTHJpZiA9ICdscmlmJyxcbiAgICBMcnNwID0gJ2xyc3AnLFxuICAgIE5vbkN1c3RvZGlhbFdhbGxldCA9ICdub24tY3VzdG9kaWFsIHdhbGxldCcsXG4gICAgTm9uVGF4YWJsZUJyb2tlcmFnZUFjY291bnQgPSAnbm9uLXRheGFibGUgYnJva2VyYWdlIGFjY291bnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgTW9uZXlNYXJrZXQgPSAnbW9uZXkgbWFya2V0JyxcbiAgICBQcmVwYWlkID0gJ3ByZXBhaWQnLFxuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBSZWN1cnJpbmcgPSAncmVjdXJyaW5nJyxcbiAgICBSZXdhcmRzID0gJ3Jld2FyZHMnLFxuICAgIFNhZmVEZXBvc2l0ID0gJ3NhZmUgZGVwb3NpdCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIHR5cGUgaXMgY2FsbGVkIGBicm9rZXJhZ2VgIGluc3RlYWQuICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFR5cGUge1xuICAgIEludmVzdG1lbnQgPSAnaW52ZXN0bWVudCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9kZXRhaWxzPzogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGZvciBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgcGF5bWVudCBkZXRhaWxzLiBJZiBzZXQsIGEgcGF5bWVudCByaXNrIGFzc2Vzc21lbnQgaXMgcGVyZm9ybWVkIGFuZCByZXR1cm5lZCBhcyBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhyZXNob2xkIHBlcmNlbnRhZ2Ugb2YgdGhlIGFjY291bnQgYmFsYW5jZSB1c2VkIGZvciBjb21wYXJpc29uIHdpdGggdGhlIHJlcXVlc3RlZCBBQ0ggZGViaXQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2U/OiBudW1iZXI7XG59XG4vKipcbiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGRldGFpbGVkIHJpc2sgYXNzZXNzbWVudCBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGZpdmUtdGllciByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgcmV0dXJuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgcmlza19sZXZlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdGVkIEFDSCBkZWJpdCBhbW91bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgKHNldCBieSBjdXN0b21lcnMpIG9mIHRoZSBhdmFpbGFibGUgb3IgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIGV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YCBhbmQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3YXMgY2FsbGVkLCBlYWNoIGFjY291bnQgd2lsbCBpbmNsdWRlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnR9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Jpc2tfYXNzZXNzbWVudD86IEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpb24vYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpb25TdGF0ZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBBdHRlbXB0ID0gJ0FUVEVNUFQnLFxuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgICBTa2lwcGVkID0gJ1NLSVBQRUQnXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgY29uc2VudCBhY3Rpdml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWN0aXZpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWN0aXZpdHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGFjdGl2aXR5OiBBY3Rpdml0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhY3Rpdml0eSB3YXMgaW5pdGlhdGVkIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdGVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWN0aXZpdHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXBwbGljYXRpb24gSUQgb2YgdGhlIGNsaWVudCB3aG8gaW5pdGlhdGVkIHRoZSBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGluaXRpYXRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpb25TdGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzdGF0ZTogQWN0aW9uU3RhdGU7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHRhcmdldF9hcHBsaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUeXBlcyBvZiBjb25zZW50IGFjdGl2aXRpZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjdGl2aXR5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBJdGVtQ3JlYXRlID0gJ0lURU1fQ1JFQVRFJyxcbiAgICBJdGVtSW1wb3J0ID0gJ0lURU1fSU1QT1JUJyxcbiAgICBJdGVtVXBkYXRlID0gJ0lURU1fVVBEQVRFJyxcbiAgICBJdGVtVW5saW5rID0gJ0lURU1fVU5MSU5LJyxcbiAgICBQb3J0YWxVbmxpbmsgPSAnUE9SVEFMX1VOTElOSycsXG4gICAgUG9ydGFsSXRlbXNEZWxldGUgPSAnUE9SVEFMX0lURU1TX0RFTEVURScsXG4gICAgSXRlbVJlbW92ZSA9ICdJVEVNX1JFTU9WRScsXG4gICAgSW52YXJpYW50Q2hlY2tlckRlbGV0aW9uID0gJ0lOVkFSSUFOVF9DSEVDS0VSX0RFTEVUSU9OJyxcbiAgICBTY29wZXNVcGRhdGUgPSAnU0NPUEVTX1VQREFURSdcbn1cblxuLyoqXG4gKiBBIHBoeXNpY2FsIG1haWxpbmcgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc1xuICAgICAqL1xuICAgIGRhdGE6IEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGFkZHJlc3Mgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc1xuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBpcyBiZWluZyB1c2VkIGZvciBjb21tZXJjaWFsIG9yIHJlc2lkZW50aWFsIHB1cnBvc2VzLiAgTm90ZTogVGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYCB3aGVuIFBsYWlkIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGRldGVybWluZSB0aGUgYWRkcmVzc1xcJ3MgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc1B1cnBvc2VMYWJlbCB7XG4gICAgUmVzaWRlbnRpYWwgPSAncmVzaWRlbnRpYWwnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFwcGxpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYXBwbGljYXRpb24gd2FzIGdyYW50ZWQgcHJvZHVjdGlvbiBhY2Nlc3MgYXQgUGxhaWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBqb2luX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIGNsaWVudOKAmXMgYnJvYWQgdXNlIGNhc2UgYXMgYXNzZXNzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VfY2FzZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgY2xpZW504oCZcyBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb21wYW55X2xlZ2FsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjaXR5IG9mIHRoZSBjbGllbnTigJlzIGhlYWRxdWFydGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZWdpb24gb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zdGFsIGNvZGUgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGNvZGUgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBcHBsaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgc2NoZW1hIGZvciBgL2FwcGxpY2F0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXREZXRhaWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRIb2xkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRPd25lciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRPd25lcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdG9yX2lkYCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRvcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIFRoZSBgYXNzZXRzYCBwcm9kdWN0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIGxpbms7IHRoZSBBc3NldHMgcHJvZHVjdCBjYW5ub3QgYmUgYWRkZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuIElmIHVzaW5nIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR5LCBgZGF5c19yZXF1ZXN0ZWRgIG11c3QgYmUgYXQgbGVhc3QgNjEgZm9yIG5ldyBvcmlnaW5hdGlvbnMgb3IgYXQgbGVhc3QgMzEgZm9yIHJlZmluYW5jaW5ncy4gIEFuIEFzc2V0IFJlcG9ydCByZXF1ZXN0ZWQgd2l0aCBcXFwiQWRkaXRpb25hbCBIaXN0b3J5XFxcIiAodGhhdCBpcywgd2l0aCBtb3JlIHRoYW4gNjEgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSB3aWxsIGluY3VyIGFuIEFkZGl0aW9uYWwgSGlzdG9yeSBmZWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLiBUaGUgb3B0aW9uYWwgYHVzZXJgIG9iamVjdCBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR5IHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIHRydWUgdG8gcmV0dXJuIGJhbGFuY2UgYW5kIGlkZW50aXR5IGVhcmxpZXIgYXMgYSBmYXN0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9mYXN0X3JlcG9ydD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGFzc2V0IHJlcG9ydC4gUG9zc2libGUgdmFsdWVzOiBgXFxcImludmVzdG1lbnRzXFxcImBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIHJlcXVlc3QgYSBgZmFzdF9hc3NldGAgcmVwb3J0LiBXaGVuIEZhc3QgQXNzZXRzIGlzIHJlcXVlc3RlZCwgUGxhaWQgd2lsbCBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IGZpcnN0LCB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IGN1cnJlbnQgaWRlbnRpdHkgYW5kIGJhbGFuY2UgaW5mb3JtYXRpb24sIGFuZCBsYXRlciwgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBoaXN0b3JpY2FsIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIHRyYW5zYWN0aW9uIGRhdGEuIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWRkX29ucz86IEFycmF5PEFzc2V0UmVwb3J0QWRkT25zPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdXNlcj86IEFzc2V0UmVwb3J0VXNlcjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGZvciB3aGljaCB0byBjcmVhdGUgYW4gYXNzZXQgcmVwb3J0IGZvci4gVGhlIGxhdGVzdCBhc3NldCByZXBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGZldGNoIFxcXCJmYXN0XFxcIiB2ZXJzaW9uIG9mIGFzc2V0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC4gQ2FuIG9ubHkgYmUgdXNlZCBpZiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdhcyBjYWxsZWQgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGZhc3RfcmVwb3J0PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgb3IgYWRkIGRhdGEgdG8gYC9hc3NldF9yZXBvcnQvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c190b19pbmNsdWRlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQXNzZXRSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBpZGVudGl0eSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0dXJuZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpZGVudGl0eSBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5nXFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIGhvbGRpbmdzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGhvbGRpbmcsIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdG90YWwgdmFsdWUgb2YgdGhlIGhvbGRpbmcuIFRoaXMgZmllbGQgaXMgY2FsY3VsYXRlZCBieSBQbGFpZCBhcyB0aGUgc3VtIG9mIHRoZSBwdXJjaGFzZSBwcmljZSBvZiBhbGwgb2YgdGhlIHNoYXJlcyBpbiB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgY29zdF9iYXNpczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBzZWN1cml0eSBpcyBhbiBvcHRpb24sIGBxdWFudGl0eWAgd2lsbCByZWZsZWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3B0aW9ucyAodHlwaWNhbGx5IHRoZSBudW1iZXIgb2YgY29udHJhY3RzIG11bHRpcGxpZWQgYnkgMTAwKSwgbm90IHRoZSBudW1iZXIgb2YgY29udHJhY3RzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW52ZXN0bWVudCBzZWN1cml0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiBWYWxpZCBzZWN1cml0eSB0eXBlcyBhcmU6ICBgY2FzaGA6IENhc2gsIGN1cnJlbmN5LCBhbmQgbW9uZXkgbWFya2V0IGZ1bmRzICBgY3J5cHRvY3VycmVuY3lgOiBEaWdpdGFsIG9yIHZpcnR1YWwgY3VycmVuY2llcyAgYGRlcml2YXRpdmVgOiBPcHRpb25zLCB3YXJyYW50cywgYW5kIG90aGVyIGRlcml2YXRpdmUgaW5zdHJ1bWVudHMgIGBlcXVpdHlgOiBEb21lc3RpYyBhbmQgZm9yZWlnbiBlcXVpdGllcyAgYGV0ZmA6IE11bHRpLWFzc2V0IGV4Y2hhbmdlLXRyYWRlZCBpbnZlc3RtZW50IGZ1bmRzICBgZml4ZWQgaW5jb21lYDogQm9uZHMgYW5kIGNlcnRpZmljYXRlcyBvZiBkZXBvc2l0IChDRHMpICBgbG9hbmA6IExvYW5zIGFuZCBsb2FuIHJlY2VpdmFibGVzICBgbXV0dWFsIGZ1bmRgOiBPcGVuLSBhbmQgY2xvc2VkLWVuZCB2ZWhpY2xlcyBwb29saW5nIGZ1bmRzIG9mIG11bHRpcGxlIGludmVzdG9ycyAgYG90aGVyYDogVW5rbm93biBvciBvdGhlciBpbnZlc3RtZW50IHR5cGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHdpdGhpbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBwb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbuKAmXMgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGFuIEFzc2V0IFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QXNzZXRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRBc3NldHM+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfdG9faW5jbHVkZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gTXVzdCBiZSBhbiBpbnRlZ2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgY2Fubm90IGJlIGBudWxsYC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBc3NldCBSZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiBvbiB0aGUgYXNzZXQgcmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWRpdF9jYXRlZ29yeT86IENyZWRpdENhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIFRoZSB1c2VyIG9iamVjdCBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB0byBiZSBhcHBlbmRlZCB0byB0aGUgQXNzZXQgUmVwb3J0LiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbC4gVGhlIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGFuZCBgc3NuYCBmaWVsZHMgYXJlIHJlcXVpcmVkIGlmIHlvdSB3b3VsZCBsaWtlIHRoZSBSZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWXigJlzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgeW91IGRldGVybWluZSBhbmQgc3VibWl0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZS4gIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gQ2F0ZWdvcnkgVHlwZSBFbnVtZXJhdGVkIGRlcml2ZWQgYnkgVmVuZG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB7XG4gICAgQXRtRmVlID0gJ0FUTUZlZScsXG4gICAgQWR2ZXJ0aXNpbmcgPSAnQWR2ZXJ0aXNpbmcnLFxuICAgIEFpclRyYXZlbCA9ICdBaXJUcmF2ZWwnLFxuICAgIEFsY29ob2xCYXJzID0gJ0FsY29ob2xCYXJzJyxcbiAgICBBbGxvd2FuY2UgPSAnQWxsb3dhbmNlJyxcbiAgICBBbXVzZW1lbnQgPSAnQW11c2VtZW50JyxcbiAgICBBcnRzID0gJ0FydHMnLFxuICAgIEF1dG9UcmFuc3BvcnQgPSAnQXV0b1RyYW5zcG9ydCcsXG4gICAgQXV0b0luc3VyYW5jZSA9ICdBdXRvSW5zdXJhbmNlJyxcbiAgICBBdXRvUGF5bWVudCA9ICdBdXRvUGF5bWVudCcsXG4gICAgQmFieVN1cHBsaWVzID0gJ0JhYnlTdXBwbGllcycsXG4gICAgQmFieXNpdHRlckRheWNhcmUgPSAnQmFieXNpdHRlckRheWNhcmUnLFxuICAgIEJhbmtGZWUgPSAnQmFua0ZlZScsXG4gICAgQmlsbHNVdGlsaXRpZXMgPSAnQmlsbHNVdGlsaXRpZXMnLFxuICAgIEJvbnVzID0gJ0JvbnVzJyxcbiAgICBCb29rc1N1cHBsaWVzID0gJ0Jvb2tzU3VwcGxpZXMnLFxuICAgIEJ1c2luZXNzU2VydmljZXMgPSAnQnVzaW5lc3MgU2VydmljZXMnLFxuICAgIEJ1eSA9ICdCdXknLFxuICAgIENhc2hBdG0gPSAnQ2FzaEFUTScsXG4gICAgQ2hhcml0eSA9ICdDaGFyaXR5JyxcbiAgICBDaGVjayA9ICdDaGVjaycsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NoaWxkU3VwcG9ydCcsXG4gICAgQ2xvdGhpbmcgPSAnQ2xvdGhpbmcnLFxuICAgIENvZmZlZVNob3BzID0gJ0NvZmZlZVNob3BzJyxcbiAgICBDcmVkaXRDYXJkUGF5bWVudCA9ICdDcmVkaXRDYXJkUGF5bWVudCcsXG4gICAgRGVudGlzdCA9ICdEZW50aXN0JyxcbiAgICBEb2N0b3IgPSAnRG9jdG9yJyxcbiAgICBFZHVjYXRpb24gPSAnRWR1Y2F0aW9uJyxcbiAgICBFbGVjdHJvbmljc1NvZnR3YXJlID0gJ0VsZWN0cm9uaWNzU29mdHdhcmUnLFxuICAgIEVudGVydGFpbm1lbnQgPSAnRW50ZXJ0YWlubWVudCcsXG4gICAgRXllY2FyZSA9ICdFeWVjYXJlJyxcbiAgICBGYXN0Rm9vZCA9ICdGYXN0Rm9vZCcsXG4gICAgRmVkZXJhbFRheCA9ICdGZWRlcmFsVGF4JyxcbiAgICBGZWVzQ2hhcmdlcyA9ICdGZWVzQ2hhcmdlcycsXG4gICAgRmluYW5jZUNoYXJnZSA9ICdGaW5hbmNlQ2hhcmdlJyxcbiAgICBGaW5hbmNpYWwgPSAnRmluYW5jaWFsJyxcbiAgICBGaW5hbmNpYWxBZHZpc29yID0gJ0ZpbmFuY2lhbEFkdmlzb3InLFxuICAgIEZvb2REaW5pbmcgPSAnRm9vZERpbmluZycsXG4gICAgRnVybmlzaGluZ3MgPSAnRnVybmlzaGluZ3MnLFxuICAgIEdhc0Z1ZWwgPSAnR2FzRnVlbCcsXG4gICAgR2lmdHNEb25hdGlvbnMgPSAnR2lmdHNEb25hdGlvbnMnLFxuICAgIEdyb2NlcmllcyA9ICdHcm9jZXJpZXMnLFxuICAgIEd5bSA9ICdHeW0nLFxuICAgIEhhaXIgPSAnSGFpcicsXG4gICAgSGVhbHRoRml0bmVzcyA9ICdIZWFsdGhGaXRuZXNzJyxcbiAgICBIZWFsdGhJbnN1cmFuY2UgPSAnSGVhbHRoSW5zdXJhbmNlJyxcbiAgICBIb2JiaWVzID0gJ0hvYmJpZXMnLFxuICAgIEhvbWUgPSAnSG9tZScsXG4gICAgSG9tZUltcHJvdmVtZW50ID0gJ0hvbWVJbXByb3ZlbWVudCcsXG4gICAgSG9tZUluc3VyYW5jZSA9ICdIb21lSW5zdXJhbmNlJyxcbiAgICBIb21lUGhvbmUgPSAnSG9tZVBob25lJyxcbiAgICBIb21lU2VydmljZXMgPSAnSG9tZVNlcnZpY2VzJyxcbiAgICBIb21lU3VwcGxpZXMgPSAnSG9tZVN1cHBsaWVzJyxcbiAgICBIb3RlbCA9ICdIb3RlbCcsXG4gICAgSW5jb21lID0gJ0luY29tZScsXG4gICAgSW50ZXJlc3RJbmNvbWUgPSAnSW50ZXJlc3RJbmNvbWUnLFxuICAgIEludGVybmV0ID0gJ0ludGVybmV0JyxcbiAgICBJbnZlc3RtZW50cyA9ICdJbnZlc3RtZW50cycsXG4gICAgS2lkcyA9ICdLaWRzJyxcbiAgICBLaWRzQWN0aXZpdGllcyA9ICdLaWRzQWN0aXZpdGllcycsXG4gICAgTGF0ZUZlZSA9ICdMYXRlRmVlJyxcbiAgICBMYXVuZHJ5ID0gJ0xhdW5kcnknLFxuICAgIExhd25HYXJkZW4gPSAnTGF3bkdhcmRlbicsXG4gICAgTGVnYWwgPSAnTGVnYWwnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnTGlmZUluc3VyYW5jZScsXG4gICAgTG9hbkluc3VyYW5jZSA9ICdMb2FuSW5zdXJhbmNlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdMb2FuUGF5bWVudCcsXG4gICAgTG9hbnMgPSAnTG9hbnMnLFxuICAgIE1vYmlsZVBob25lID0gJ01vYmlsZVBob25lJyxcbiAgICBNb3J0Z2FnZVJlbnQgPSAnTW9ydGdhZ2VSZW50JyxcbiAgICBNb3ZpZXNEdmRzID0gJ01vdmllc0RWRHMnLFxuICAgIE11c2ljID0gJ011c2ljJyxcbiAgICBOZXdzcGFwZXJzTWFnYXppbmVzID0gJ05ld3NwYXBlcnNNYWdhemluZXMnLFxuICAgIE9mZmljZVN1cHBsaWVzID0gJ09mZmljZVN1cHBsaWVzJyxcbiAgICBQYXJraW5nID0gJ1BhcmtpbmcnLFxuICAgIFBheWNoZWNrID0gJ1BheWNoZWNrJyxcbiAgICBQZXJzb25hbENhcmUgPSAnUGVyc29uYWxDYXJlJyxcbiAgICBQZXRGb29kU3VwcGxpZXMgPSAnUGV0Rm9vZFN1cHBsaWVzJyxcbiAgICBQZXRHcm9vbWluZyA9ICdQZXRHcm9vbWluZycsXG4gICAgUGV0cyA9ICdQZXRzJyxcbiAgICBQaGFybWFjeSA9ICdQaGFybWFjeScsXG4gICAgUHJpbnRpbmcgPSAnUHJpbnRpbmcnLFxuICAgIFByb3BlcnR5VGF4ID0gJ1Byb3BlcnR5IFRheCcsXG4gICAgUHVibGljVHJhbnNwb3J0YXRpb24gPSAnUHVibGljIFRyYW5zcG9ydGF0aW9uJyxcbiAgICBSZWltYnVyc2VtZW50ID0gJ1JlaW1idXJzZW1lbnQnLFxuICAgIFJlbnRhbENhclRheGkgPSAnUmVudGFsQ2FyVGF4aScsXG4gICAgUmVzdGF1cmFudHMgPSAnUmVzdGF1cmFudHMnLFxuICAgIFNhbGVzVGF4ID0gJ1NhbGVzVGF4JyxcbiAgICBTZXJ2aWNlUGFydHMgPSAnU2VydmljZVBhcnRzJyxcbiAgICBTZXJ2aWNlRmVlID0gJ1NlcnZpY2VGZWUnLFxuICAgIFNoaXBwaW5nID0gJ1NoaXBwaW5nJyxcbiAgICBTaG9wcGluZyA9ICdTaG9wcGluZycsXG4gICAgU3BhTWFzc2FnZSA9ICdTcGFNYXNzYWdlJyxcbiAgICBTcG9ydGluZ0dvb2RzID0gJ1Nwb3J0aW5nR29vZHMnLFxuICAgIFNwb3J0cyA9ICdTcG9ydHMnLFxuICAgIFN0YXRlVGF4ID0gJ1N0YXRlVGF4JyxcbiAgICBTdHVkZW50TG9hbiA9ICdTdHVkZW50IExvYW4nLFxuICAgIFRheGVzID0gJ1RheGVzJyxcbiAgICBUZWxldmlzaW9uID0gJ1RlbGV2aXNpb24nLFxuICAgIFRveXMgPSAnVG95cycsXG4gICAgVHJhbnNmZXIgPSAnVHJhbnNmZXInLFxuICAgIFRyYXZlbCA9ICdUcmF2ZWwnLFxuICAgIFR1aXRpb24gPSAnVHVpdGlvbicsXG4gICAgVW5jYXRlZ29yaXplZCA9ICdVbmNhdGVnb3JpemVkJyxcbiAgICBVdGlsaXRpZXMgPSAnVXRpbGl0aWVzJyxcbiAgICBWYWNhdGlvbiA9ICdWYWNhdGlvbicsXG4gICAgVmV0ZXJpbmFyeSA9ICdWZXRlcmluYXJ5J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEZXNjcmlwdGlvbiBTdHJpbmcgdXAgdG8gMyBvY2N1cmFuY2VzIDEgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdmVuZG9yIGNyZWF0ZWQgdW5pcXVlIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25VbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gQW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBQb3N0IERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25Qb3N0RGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlOiBBc3NldFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB3aXRoIHdobyBkaWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUGFpZEJ5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGSSBQcm92aWRlZCAtIGV4YW1wbGVzIGFyZSBhdG0sIGNhc2gsIGNoZWNrLCBjcmVkaXQsIGRlYml0LCBkZXBvc2l0LCBkaXJlY3REZWJpdCwgZGlyZWN0RGVwb3NpdCwgZGl2aWRlbmQsIGZlZSwgaW50ZXJlc3QsIG90aGVyLCBwYXltZW50LCBwb2ludE9mU2FsZSwgcmVwZWF0UGF5bWVudCwgc2VydmljZUNoYXJnZSwgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZTogQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgcHJvdmlkZWQgVHJhbnNhY3Rpb24gSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2FjdGlvbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIFR5cGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQ3JlZGl0ID0gJ0NyZWRpdCcsXG4gICAgRGViaXQgPSAnRGViaXQnXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgZmluYW5jaWFsIGFzc2V0cyBpbiBhIG1vcnRnYWdlIGxvYW4gdHJhbnNhY3Rpb24uIEFzc2V0cyBtYXkgYmUgZWl0aGVyIGxpcXVpZCBvciBmaXhlZCBhbmQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgYXNzZXQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUeXBlIHtcbiAgICBDaGVja2luZ0FjY291bnQgPSAnQ2hlY2tpbmdBY2NvdW50JyxcbiAgICBTYXZpbmdzQWNjb3VudCA9ICdTYXZpbmdzQWNjb3VudCcsXG4gICAgSW52ZXN0bWVudCA9ICdJbnZlc3RtZW50JyxcbiAgICBNb25leU1hcmtldEZ1bmQgPSAnTW9uZXlNYXJrZXRGdW5kJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldD59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxBc3NldD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzRXJyb3JXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBBc3NldCBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW914oCZbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgQXNzZXQgUmVwb3J0IHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXBvcnQgdHlwZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBBc3NldCBSZXBvcnQgaXMgYSBgZnVsbGAgb3IgYGZhc3RgIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0TnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCQUNTIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEF1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRzYCBmb3Igd2hpY2ggbnVtYmVycyBhcmUgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBdXRoIGZlYXR1cmVzIG9mIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoU3VwcG9ydGVkTWV0aG9kc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aE1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydGVkX21ldGhvZHM6IEF1dGhTdXBwb3J0ZWRNZXRob2RzIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gd2hpY2ggYXV0aCBtZXRob2RzIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBhdXRoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWF0Y2ggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF1dG9tYXRlZCBtaWNyb2RlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IG1pY3JvZGVwb3NpdHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgdmVyaWZpZWQgdmlhIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0cy4gV2UgcmVjb21tZW5kIGNvbW11bmljYXRpbmcgdG8geW91ciB1c2VycyB3aGVuIHRoaXMgZXZlbnQgaXMgcmVjZWl2ZWQgdG8gbm90aWZ5IHRoZW0gdGhhdCB0aGVpciBhY2NvdW50IGlzIHZlcmlmaWVkIGFuZCByZWFkeSBmb3IgdXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgaW4gQ1JBIGVuYWJsZWQgY2xpZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVmcmVzaCByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIHJlZnJlc2hlZCByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlZnJlc2hlZCBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC4gVG8gZ2V0IHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIHZpYSB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgaXMgZGV0ZWN0ZWQuIFlvdSBzaG91bGQgY2FsbCBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCB0byBnZXQgdXBkYXRlZCBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuIFRvIHJlY2VpdmUgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgaW4gdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgYGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBlaWdodCByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wJSAtIDAuNSUgICAyOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC41JSAtIDEuNSUgICAzOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMS41JSAtIDMlICAgNDogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDMlIC0gNSUgICA1OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gNSUgLSAxMCUgICA2OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTAlIC0gMTUlICAgNzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDE1JSBhbmQgNTAlICAgODogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gNTAlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIGEgYmFuayB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlIC0gdGhlIHN1bSBvZiBhbGwgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2ZlciBhbW91bnRzIG1pbnVzIGFsbCBjcmVkaXQgdHJhbnNmZXIgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHJhbnNhY3RhYmxlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IEJhbmtUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYCBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMsIG9yIGBpbmJvdW5kYCBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBCYW5rVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU/OiBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgYmFuayB0cmFuc2ZlciByZXByZXNlbnRzLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgY2FuY2VsbGVkYDogVGhlIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHBvc3RlZGA6IFRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmV2ZXJzZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSB0eXBlIG9mIHRoaXMgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldmVyc2VkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXZlcnNlZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW0JhbmsgVHJhbnNmZXJzIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYmFuay10cmFuc2ZlcnMvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYmFuayB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSBvcmlnaW5hdGVkIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyczogQXJyYXk8QmFua1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIFRoaXMgaXMgdGhlIEFCQSBudW1iZXI7IGZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIEFDSCBudW1iZXIgdXNlZCBpbiBgcm91dGluZ19udW1iZXJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudCAoYGNoZWNraW5nYCBvciBgc2F2aW5nc2ApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCwgYHNhbWUtZGF5LWFjaGAsIG9yIGB3aXJlYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBXaXJlID0gJ3dpcmUnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXAgZGVzY3JpYmVzIGEgc3dlZXAgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogQmFua1RyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHRoYXQgdGhlIHN3ZWVwcyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGZ1bGwgbGVnYWwgbmFtZS4gSWYgdGhlIHRyYW5zZmVyIGBhY2hfY2xhc3NgIGlzIGBjY2RgLCB0aGlzIHNob3VsZCBiZSB0aGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGVtYWlsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpbiByZXNwb25zZSBkYXRhLiBEbyBub3QgcHJvdmlkZSB0aGlzIGZpZWxkIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgYmFuayB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IEFDSCBldmVudHMgYXJlIGF2YWlsYWJsZS4gVG8gYmVnaW4gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IG11c3QgZmlyc3QgcmVnaXN0ZXIgeW91ciB3ZWJob29rIGxpc3RlbmVyIGVuZHBvaW50IHZpYSB0aGUgW3dlYmhvb2tzIHBhZ2UgaW4gdGhlIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vd2ViaG9va3MpLiBUaGUgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgY2FuIGJlIHVzZWQgdG8gdHJhY2sgdGhlIHByb2dyZXNzIG9mIEFDSCB0cmFuc2ZlcnMgdXNlZCBpbiBbbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb25dKC9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLiBOb3RlIHRoYXQgW1RyYW5zZmVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSBjdXN0b21lcnMgc2hvdWxkIHVzZSBUcmFuc2ZlciB3ZWJob29rcyBpbnN0ZWFkIG9mIHVzaW5nIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYDsgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50cyBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQmFzZSBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBCYXNlIFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IFBsYWlkIGFib3V0IGVhY2ggb2YgdGhlIEl0ZW1zIGluY2x1ZGVkIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEJhc2VSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlcztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzLiBUcmFuc2FjdGlvbiBoaXN0b3J5IHJldHVybmVkIGJ5IGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSB0b3AtbGV2ZWwgYHRyYW5zYWN0aW9uc2AgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PEJhc2VSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPd25lcnNoaXBUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlOiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzIGFuZCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBieSBgYnJva2VyYWdlYCBvciBgaW52ZXN0bWVudGAgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEhpc3RvcmljYWxCYWxhbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRBY2NvdW50SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pbnNpZ2h0cz86IEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHM7XG59XG4vKipcbiAqIEJhc2UgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbHRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGFzIGJlZW4gdXBkYXRlZCAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBwcm92aWRlZCB3aGVuIHRoZSBgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZWAgaXMgcGFzc2VkIHdoZW4gY2FsbGluZyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBvZiBlYWNoIGNhbGVuZGFyIG1vbnRoXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIG9mIGVhY2ggY2FsZW5kYXIgbW9udGhcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzQWxsT2ZcbiAgICAgKi9cbiAgICBhdmVyYWdlX21vbnRobHlfYmFsYW5jZXM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcz47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZyb20gdGhlIG1vc3QgcmVjZW50IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzQWxsT2ZcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgaW5zaWdodHMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIGRheXMgYXZhaWxhYmxlIGluIHRoZSBiYXNlIHJlcG9ydCBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2RheXNfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTG9uZ2VzdCBnYXAgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvbmdlc3RfZ2FwX2JldHdlZW5fdHJhbnNhY3Rpb25zPzogQXJyYXk8QmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkZWJpdHMgaW50byB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9pbmZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIGFjY291bnQuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfaW5mbG93X2Ftb3VudD86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjcmVkaXQgaW50byB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9vdXRmbG93cz86IEFycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9vdXRmbG93X2Ftb3VudD86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBubyB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2RheXNfbm9fdHJhbnNhY3Rpb25zPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBdmVyYWdlIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IG9yIGRlYml0IHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFkZGVkIGZvciBkZXBvc2l0b3J5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5O1xufVxuLyoqXG4gKiBBdmVyYWdlIGJhbGFuY2UgaW4gZG9sbGFyIGFtb3VudCBwZXIgbW9udGhcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEJhc2VSZXBvcnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQmFzZVJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvYmFzZV9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEJhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEJhc2UgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PEJhc2VSZXBvcnRXYXJuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGEgQmFzZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0SXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhpcyBJdGVt4oCZcyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJhc2VSZXBvcnRBY2NvdW50Pjtcbn1cbi8qKlxuICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIHBlciBjYWxlbmRhciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExhcmdlc3QgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5cz86IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIG51bWJlciBvZiBjcmVkaXRzIG9yIGRlYml0cyBvdXQgb2YgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFkZGVkIGZvciBkZXBvc2l0b3J5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjcmVkaXRzIG9yIGRlYml0cyBvdXQgb2YgdGhlIGFjY291bnQgZm9yIHRoaXMgdGltZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIG9uIHRoZSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgdHJhbnNhY3Rpb24gdG9vayBwbGFjZSwgaW4gSVMwIDg2MDEgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhbiBCYXNlIFJlcG9ydCB0byBiZSByZXR1cm5lZCB3aXRoIG1pc3NpbmcgYWNjb3VudCBvd25lciBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIEJhc2UgUmVwb3J0IHdpbGwgY29udGFpbiB3YXJuaW5nIGRhdGEgaW4gdGhlIHJlc3BvbnNlLCBpbmRpY2F0aW5nIHdoeSBvYnRhaW5pbmcgdGhlIG93bmVyIGluZm9ybWF0aW9uIGZhaWxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydFdhcm5pbmdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgdHlwZSwgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEJBU0VfUkVQT1JUX1dBUk5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydFdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogQmFzZVJlcG9ydFdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYXNlUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIE93bmVyc1VuYXZhaWxhYmxlID0gJ09XTkVSU19VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBUaGUgcmVzdWx0aW5nIGBlcnJvcmAgd2lsbCBoYXZlIGFuIGBlcnJvcl90eXBlYCBvZiBgQkFTRV9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQkFTRV9SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBCYXNlIFJlcG9ydCBoYXMgYmVlbiBnZW5lcmF0ZWQgYW5kIGAvY3JhL2Jhc2VfcmVwb3J0L2dldGAgaXMgcmVhZHkgdG8gYmUgY2FsbGVkLiAgSWYgeW91IGF0dGVtcHQgdG8gcmV0cmlldmUgYSBCYXNlIFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW914oCZbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydHNQcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQkFTRV9SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGNoYW5nZSBtYWRlIHRvIHRoZSBwYXJlbnQgb2JqZWN0IHNwZWNpZnlpbmcgd2hhdCBjYXVzZWQgdGhlIGNoYW5nZSBhcyB3ZWxsIGFzIHdoZW4gaXQgb2NjdXJyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkF1ZGl0VHJhaWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkF1ZGl0VHJhaWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbFNvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHNvdXJjZTogQmVhY29uQXVkaXRUcmFpbFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hhdCBjYXVzZWQgYSByZXNvdXJjZSB0byBiZSBjaGFuZ2VkIG9yIHVwZGF0ZWQuICAgYGRhc2hib2FyZGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBieSBhIG1lbWJlciBvZiB5b3VyIHRlYW0gdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuICBgYXBpYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIHZpYSB0aGUgUGxhaWQgQVBJLiAgYHN5c3RlbWAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgcGFydCBvZiB0aGUgUGxhaWQgQmVhY29uIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGlmIGFub3RoZXIgYnVzaW5lc3MgdXNpbmcgUGxhaWQgQmVhY29uIGNyZWF0ZWQgYSBmcmF1ZCByZXBvcnQgdGhhdCBtYXRjaGVkIG9uZSBvZiB5b3VyIHVzZXJzLCB5b3VyIG1hdGNoaW5nIHVzZXJcXCdzIHN0YXR1cyB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgYW5kIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYHN5c3RlbWAuICBgYnVsa19pbXBvcnRgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYXMgcGFydCBvZiBhIGJ1bGsgaW1wb3J0IHByb2Nlc3MuIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbXBhbnkgcHJvdmlkZWQgYSBDU1Ygb2YgdXNlciBkYXRhIGFzIHBhcnQgb2YgeW91ciBpbml0aWFsIG9uYm9hcmRpbmcsIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYGJ1bGtfaW1wb3J0YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2Uge1xuICAgIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nLFxuICAgIEJ1bGtJbXBvcnQgPSAnYnVsa19pbXBvcnQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIEJlYWNvbiBVc2VyIGNyZWF0ZWQgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uIG1hdGNoZXMgb25lIG9mIHlvdXIgZXhpc3RpbmcgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRFVQTElDQVRFX0RFVEVDVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIG1hdGNoIHR5cGUgYmV0d2VlbiB0d28gQmVhY29uIFVzZXJzLiAgIGBtYXRjaGAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgd2FzIGEgc3Ryb25nIG1hdGNoIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyLiAgYHBhcnRpYWxfbWF0Y2hgIGluZGljYXRlcyB0aGUgZGF0YSBhcHByb3hpbWF0ZWx5IG1hdGNoZWQgdGhlIG90aGVyIEJlYWNvbiBVc2VyLiBGb3IgZXhhbXBsZSwgXFxcIktub3BlXFxcIiB2cy4gXFxcIktub3BlLVd5YXR0XFxcIiBmb3IgbGFzdCBuYW1lLiAgYG5vX21hdGNoYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgYWJsZSB0byBjb21wYXJlIHRoaXMgZmllbGQgYWdhaW5zdCB0aGUgb3RoZXIgQmVhY29uIFVzZXIgYW5kIGl0IGRpZCBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBjb21wYXJlIHRoaXMgZmllbGQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgQmVhY29uIFVzZXIgYmVjYXVzZSB0aGUgZmllbGQgd2FzIG5vdCBwcmVzZW50IGluIG9uZSBvZiB0aGUgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50PzogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudDogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBvbmUgb2YgeW91ciBCZWFjb24gVXNlcnMgaXMgZmlyc3QgcmVwb3J0ZWQgdG8gdGhlIEJlYWNvbiBuZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIEJlYWNvbiBSZXBvcnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0czogQXJyYXk8QmVhY29uUmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIHJlcHJlc2VudHMgYSBCZWFjb24gUmVwb3J0IGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdXIgb3JnYW5pemF0aW9uIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIEJlYWNvbiBVc2VyIHlvdVxcJ3ZlIGNyZWF0ZWQuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uICBUaGUgYHJlcG9ydGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlcG9ydCBjcmVhdGVkIG9uIHRoZSBCZWFjb24gTmV0d29yayBtYXRjaGVzIHdpdGggb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9TWU5ESUNBVElPTl9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X3N5bmRpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIHJlcHJlc2VudHMgYSBCZWFjb24gUmVwb3J0IGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdXIgb3JnYW5pemF0aW9uIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIEJlYWNvbiBVc2VyIHlvdVxcJ3ZlIGNyZWF0ZWQuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uICBUaGUgYHJlcG9ydGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbmFseXNpczogQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X3N5bmRpY2F0aW9uczogQXJyYXk8QmVhY29uUmVwb3J0U3luZGljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgaW5mb3JtYXRpb24gZnJvbSBhIEJlYWNvbiBSZXBvcnQgdGhhdCBoYXMgYmVlbiBzeW5kaWNhdGVkIHRvIGEgbWF0Y2hpbmcgQmVhY29uIFVzZXIgaW4geW91ciBwcm9ncmFtLiAgVGhlIGBpZGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGlzIHRoZSBJRCBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0IHRoYXQgd2FzIHN5bmRpY2F0ZWQuIElmIHRoZSBvcmlnaW5hbCByZXBvcnQgd2FzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24sIHRoZSBmaWVsZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBJRCBvZiB0aGUgcmVwb3J0LiBPdGhlcndpc2UsIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYCBpbmRpY2F0aW5nIHRoYXQgdGhlIG9yaWdpbmFsIHJlcG9ydCB3YXMgY3JlYXRlZCBieSBhbm90aGVyIEJlYWNvbiBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGB1bmtub3duYDogSWYgeW91IGFyZW5cXCd0IHN1cmUgd2hvIGNvbW1pdHRlZCB0aGUgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25SZXBvcnRUeXBlIHtcbiAgICBGaXJzdFBhcnR5ID0gJ2ZpcnN0X3BhcnR5JyxcbiAgICBTdG9sZW4gPSAnc3RvbGVuJyxcbiAgICBTeW50aGV0aWMgPSAnc3ludGhldGljJyxcbiAgICBBY2NvdW50VGFrZW92ZXIgPSAnYWNjb3VudF90YWtlb3ZlcicsXG4gICAgVW5rbm93biA9ICd1bmtub3duJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHlvdXIgZXhpc3RpbmcgQmVhY29uIFJlcG9ydHMgaGFzIGJlZW4gbW9kaWZpZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIGEgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgdGhlIHVzZXIgaGFzIHN1Ym1pdHRlZCB0aGVpciBhZGRyZXNzLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSBCZWFjb24gVXNlci4gIFRoZSBwcmltYXJ5IHVzZSBmb3IgdGhpcyBlbmRwb2ludCBpcyB0byBhZGQgYSBuZXcgZW5kIHVzZXIgdG8gQmVhY29uIGZvciBmcmF1ZCBhbmQgZHVwbGljYXRlIHNjYW5uaW5nLiBUaGlzIGVuZHBvaW50IGNhbiBhbHNvIGJlIHVzZWQgdG8gaW1wb3J0IGhpc3RvcmljYWwgZnJhdWQgY2FzZXMgaW50byB0aGUgQmVhY29uIE5ldHdvcmsgd2l0aG91dCBiZWluZyBjaGFyZ2VkIGZvciBjcmVhdGluZyBhIEJlYWNvbiBVc2VyLiBUbyBpbXBvcnQgaGlzdG9yaWNhbCBmcmF1ZCBjYXNlcywgZW1iZWQgdGhlIGZyYXVkIHJlcG9ydCBpbiB0aGUgb3B0aW9uYWwgYHJlcG9ydGAgc2VjdGlvbiBvZiB0aGUgcmVxdWVzdCBwYXlsb2FkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdERhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlclJlcXVlc3REYXRhO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXJcXCdzIGRhdGEgYW5kIHJlc3VsdGluZyBhbmFseXNpcyB3aGVuIGNoZWNrZWQgYWdhaW5zdCBkdXBsaWNhdGUgcmVjb3JkcyBhbmQgdGhlIEJlYWNvbiBGcmF1ZCBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIG5hbWU6IEJlYWNvblVzZXJOYW1lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25Vc2VyQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQVjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIElEIG51bWJlciBhc3NvY2lhdGVkIHdpdGggYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlcklETnVtYmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBpZGVudGl0eSBkb2N1bWVudCB2YWx1ZSB0eXBlZCBpbiBieSB1c2VyLiBBbHBoYS1udW1lcmljLCB3aXRoIGFsbCBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgc3RyaXBwZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiB0aGUgdXNlciBoYXMgc3VibWl0dGVkIHRoZWlyIGFkZHJlc3MsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiB0aGUgdXNlciBoYXMgc3VibWl0dGVkIHRoZWlyIGFkZHJlc3MsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyXFwncyBkYXRhIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgYWdhaW5zdCBkdXBsaWNhdGUgcmVjb3JkcyBhbmQgdGhlIEJlYWNvbiBGcmF1ZCBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25Vc2VyTmFtZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJlcXVlc3RBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQVjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgdXBkYXRpbmcgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIGByZWplY3RlZGA6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiByZWplY3RlZCBmb3IgZnJhdWQuIFVzZXJzIGNhbiBiZSBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5IHJlamVjdGVkLiAgYHBlbmRpbmdfcmV2aWV3YDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIG1hcmtlZCBmb3IgcmV2aWV3LiAgYGNsZWFyZWRgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gY2xlYXJlZCBvZiBmcmF1ZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvblVzZXJTdGF0dXMge1xuICAgIFJlamVjdGVkID0gJ3JlamVjdGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBDbGVhcmVkID0gJ2NsZWFyZWQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIEJlYWNvbiBVc2VyIHN0YXR1cyBoYXMgY2hhbmdlZCwgd2hpY2ggY2FuIG9jY3VyIG1hbnVhbGx5IHZpYSB0aGUgZGFzaGJvYXJkIG9yIHdoZW4gaW5mb3JtYXRpb24gaXMgcmVwb3J0ZWQgdG8gdGhlIEJlYWNvbiBuZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgdXBkYXRpbmcgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3Vic2V0IG9mIGEgQmVhY29uIFVzZXJcXCdzIGRhdGEgd2hpY2ggaXMgdXNlZCB0byBwYXRjaCB0aGUgZXhpc3RpbmcgaWRlbnRpdHkgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBCZWFjb24gVXNlci4gQXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZU51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogQmVhY29uVXNlck5hbWVOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ2F0ZWdvcmllc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jYXRlZ29yaWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhbGwgb2YgdGhlIHRyYW5zYWN0aW9uIGNhdGVnb3JpZXMgdXNlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yaWVzOiBBcnJheTxDYXRlZ29yeT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyBhIHRyYW5zYWN0aW9uIGNhdGVnb3J5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZ5aW5nIG51bWJlciBmb3IgdGhlIGNhdGVnb3J5LiBgY2F0ZWdvcnlfaWRgIGlzIGEgUGxhaWQtc3BlY2lmaWMgaWRlbnRpZmllciBhbmQgZG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBtZXJjaGFudCBjYXRlZ29yeSBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHBsYWNlYCBmb3IgcGh5c2ljYWwgdHJhbnNhY3Rpb25zIG9yIGBzcGVjaWFsYCBmb3Igb3RoZXIgdHJhbnNhY3Rpb25zIHN1Y2ggYXMgYmFuayBjaGFyZ2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgZ3JvdXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIGBjYXRlZ29yeV9pZGAgYmVsb25ncy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBoaWVyYXJjaHk6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEluc2lnaHRzIG9iamVjdCBmb3IgY2F0ZWdvcmllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIENhdGVnb3J5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2Ygb3V0ZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBpbmZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBjb3VudGVycGFydGllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXRlZ29yeSBzb3J0ZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvcF9jb3VudGVycGFydGllcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEluc2lnaHRzIG9uIGEgdXNlclxcJ3MgdG9wIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5zaWdodHMgb2YgdG9wIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIHJhbmtlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0c1xuICAgICAqL1xuICAgIHByaW1hcnlfY2F0ZWdvcnlfaW5zaWdodHM/OiBBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPjtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluc2lnaHRzIG9mIHRvcCBkZXRhaWxlZCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgcmFua2VkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHRzXG4gICAgICovXG4gICAgZGV0YWlsZWRfY2F0ZWdvcnlfaW5zaWdodHM/OiBBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPjtcbn1cbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IGFuZCBhc3NvY2lhdGVkIGBpdGVtX2lkYCB1c2VkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgSXRlbSBhbmQgZXJyb3Igd2hlbiBhIGJhdGNoIG9wZXJhdGlvbiBvcGVyYXRpbmcgb24gbXVsdGlwbGUgSXRlbXMgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIGluIG9uZSBvZiB0aGUgSXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdXNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXVzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhlIEFzc2V0cyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZUFsbE9mXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXVzZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VBbGxPZlxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVuaGFuY2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFVuaXF1ZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHRvIHRpZSB0cmFuc2FjdGlvbnMgYmFjayB0byBjbGllbnRzXFwnIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSBhY2NvdW50XFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5oYW5jZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBlbmhhbmNlbWVudHM6IEVuaGFuY2VtZW50cztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gdGhhdCBQbGFpZCBoYXMgZW5yaWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIGFzIHByb3ZpZGVkIGJ5IHlvdSBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF91c2VyX2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFjY291bnQgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gYWNjb3VudCwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF9hY2NvdW50X2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uICg+PSAwKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VucmljaG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBlbnJpY2htZW50czogRW5yaWNobWVudHM7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIGZvciBQbGFpZCB0byBlbmhhbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGhlbHAgeW91IHRpZSBkYXRhIGJhY2sgdG8geW91ciBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkaXJlY3Rpb24uIChOT1RFOiB0aGlzIHdpbGwgYWZmZWN0IGVucmljaG1lbnQgcmVzdWx0cywgc28gZGlyZWN0aW9ucyBhcmUgaW1wb3J0YW50KTouICAgTmVnYXRpdmUgKC0pIGZvciBjcmVkaXRzIChlLmcuLCBpbmNvbWluZyB0cmFuc2ZlcnMsIHJlZnVuZHMpICAgUG9zaXRpdmUgKCspIGZvciBkZWJpdHMgKGUuZy4sIHB1cmNoYXNlcywgZmVlcywgb3V0Z29pbmcgdHJhbnNmZXJzKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24gZS5nLiBVU0QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIGZvciBQbGFpZCB0byBlbnJpY2guXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIHVzZWQgdG8gaGVscCB5b3UgdGllIGRhdGEgYmFjayB0byB5b3VyIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB1c2VyLCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X3VzZXJfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFjY291bnQgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gYWNjb3VudCwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF9hY2NvdW50X2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uIElmIHlvdSBoYXZlIGxvY2F0aW9uIGRhdGEgaW4gYXZhaWxhYmxlIGFuIHVuc3RydWN0dXJlZCBmb3JtYXQsIGl0IG1heSBiZSBhcHBlbmRlZCB0byB0aGUgYGRlc2NyaXB0aW9uYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uICg+PSAwKS4gV2hlbiB0ZXN0aW5nIEVucmljaCwgbm90ZSB0aGF0IGBhbW91bnRgIGRhdGEgc2hvdWxkIGJlIHJlYWxpc3RpYy4gVW5yZWFsaXN0aWMgb3IgaW5hY2N1cmF0ZSBgYW1vdW50YCBkYXRhIG1heSByZXN1bHQgaW4gcmVkdWNlZCBxdWFsaXR5IG91dHB1dC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGlyZWN0aW9uOiBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24gZS5nLiBVU0QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIE1lcmNoYW50IGNhdGVnb3J5IGNvZGVzIChNQ0NzKSBhcmUgZm91ci1kaWdpdCBudW1iZXJzIHRoYXQgZGVzY3JpYmUgYSBtZXJjaGFudFxcJ3MgcHJpbWFyeSBidXNpbmVzcyBhY3Rpdml0aWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtY2M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2Ygd2hlcmUgYSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLiAgVXNlIHRoaXMgZmllbGQgdG8gcGFzcyBpbiBzdHJ1Y3R1cmVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIHlvdSBtYXkgaGF2ZSBhYm91dCB5b3VyIHRyYW5zYWN0aW9ucy4gUHJvdmlkaW5nIGxvY2F0aW9uIGRhdGEgaXMgb3B0aW9uYWwgYnV0IGNhbiBpbmNyZWFzZSByZXN1bHQgcXVhbGl0eS4gSWYgeW91IGhhdmUgdW5zdHJ1Y3R1cmVkIGxvY2F0aW9uIGluZm9ybWF0aW9uLCBpdCBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50cnkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGRpc3BsYXkgcHVycG9zZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGRpc3BsYXlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBVUkwgdGhhdCBsaW5rcyB0byB0aGUgYXBwbGljYXRpb24gbG9nbyBpbWFnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYXBwbGljYXRpb24gd2FzIGxpbmtlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSByZWFzb24gYSBjb25zdW1lciByZXBvcnQgaXMgY3JlYXRlZCBmb3IgIGBBQ0NPVU5UX1JFVklFV19DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjb25zdW1lciBjcmVkaXQgdHJhbnNhY3Rpb24gZm9yIHRoZSByZXZpZXcgb3IgY29sbGVjdGlvbiBvZiBhbiBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuIGBBQ0NPVU5UX1JFVklFV19OT05fQ1JFRElUYDogRm9yIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBuZWVkIG9mIHRoZSBpbmZvcm1hdGlvbiB0byByZXZpZXcgYSBub24tY3JlZGl0IGFjY291bnQgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBwZXJzb25hbCwgZmFtaWx5LCBvciBob3VzZWhvbGQgcHVycG9zZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnN1bWVyIGNvbnRpbnVlcyB0byBtZWV0IHRoZSB0ZXJtcyBvZiB0aGUgYWNjb3VudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKDIpLiBgRU1QTE9ZTUVOVGA6IEZvciBlbXBsb3ltZW50IHB1cnBvc2VzIHB1cnN1YW50IHRvIEZDUkEgNjA0KGEpKDMpKEIpLCBpbmNsdWRpbmcgaGlyaW5nLCByZXRlbnRpb24gYW5kIHByb21vdGlvbiBwdXJwb3Nlcy4gYEVYVEVOU0lPTl9PRl9DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjcmVkaXQgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IGFuZCBpbnZvbHZpbmcgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuIGBMRUdJVElNQVRFX0JVU0lORVNTX05FRURfVEVOQU5UX1NDUkVFTklOR2A6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIHB1cnBvc2VzIGluIGNvbm5lY3Rpb24gd2l0aCBhIHByb3BlcnR5IHJlbnRhbCBhc3Nlc3NtZW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoaSkuIGBMRUdJVElNQVRFX0JVU0lORVNTX05FRURfT1RIRVJgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgaW4gY29ubmVjdGlvbiB3aXRoIGEgYnVzaW5lc3MgdHJhbnNhY3Rpb24gbWFkZSBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBpbml0aWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoaSkuIGBXUklUVEVOX0lOU1RSVUNUSU9OX1BSRVFVQUxJRklDQVRJT05gOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCB0byBldmFsdWF0ZSBhbiBhcHBsaWNhdGlvbuKAmXMgcHJvZmlsZSB0byBtYWtlIGFuIG9mZmVyIHRvIHRoZSBjb25zdW1lci4gYFdSSVRURU5fSU5TVFJVQ1RJT05fT1RIRVJgOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCBzdWNoIGFzIHdoZW4gYW4gaW5kaXZpZHVhbCBhZ3JlZXMgdG8gYWN0IGFzIGEgZ3VhcmFudG9yIG9yIGFzc3VtZXMgcGVyc29uYWwgbGlhYmlsaXR5IGZvciBhIGNvbnN1bWVyLCBidXNpbmVzcywgb3IgY29tbWVyY2lhbCBsb2FuLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2Uge1xuICAgIEFjY291bnRSZXZpZXdDcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfQ1JFRElUJyxcbiAgICBBY2NvdW50UmV2aWV3Tm9uQ3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX05PTl9DUkVESVQnLFxuICAgIEVtcGxveW1lbnQgPSAnRU1QTE9ZTUVOVCcsXG4gICAgRXh0ZW5zaW9uT2ZDcmVkaXQgPSAnRVhURU5TSU9OX09GX0NSRURJVCcsXG4gICAgTGVnaXRpbWF0ZUJ1c2luZXNzTmVlZFRlbmFudFNjcmVlbmluZyA9ICdMRUdJVElNQVRFX0JVU0lORVNTX05FRURfVEVOQU5UX1NDUkVFTklORycsXG4gICAgTGVnaXRpbWF0ZUJ1c2luZXNzTmVlZE90aGVyID0gJ0xFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUicsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uUHJlcXVhbGlmaWNhdGlvbiA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX1BSRVFVQUxJRklDQVRJT04nLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvbk90aGVyID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fT1RIRVInXG59XG5cbi8qKlxuICogQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHkgZGVmaW5lcyB0aGUgdXNlciBpZGVudGl0eSBkYXRhIGNvbGxlY3RlZCBmb3IgY29uc3VtZXIgcmVwb3J0IHB1cnBvc2UuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IGlmIHlvdSBsYXRlciB1c2UgdGhlIGNyZWF0ZWQgdXNlciBmb3IgY29uc3VtZXIgcmVwb3J0IHB1cnBvc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmaXJzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgbGFzdF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlcnMuIFRoZSBmb3JtYXQgb2YgcGhvbmUgbnVtYmVyIHdpbGwgYmUgdmFsaWRhdGVkIGFuZCBmb3IgYmV0dGVyIG5vcm1hbGl6YXRpb24sIGl0IGlzIGV4cGVjdGVkIHRvIGJlIGluIEUuMTY0IGZvcm1hdCAre2NvdW50cnljb2RlfXtudW1iZXJ9LCBmb3IgZXhhbXBsZSBgKzE0MTUxMjM0NTY3YC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHByaW1hcnlfYWRkcmVzczogQWRkcmVzc0RhdGE7XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgdHlwZTogQ291bnRlcnBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGxvZ29fdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgaG93IGNvbmZpZGVudCB3ZSBhcmUgdGhhdCB0aGUgcHJvdmlkZWQgY291bnRlcnBhcnR5IGlzIGludm9sdmVkIGluIHRoZSB0cmFuc2FjdGlvbi4gIGBWRVJZX0hJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDkwJSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgTUVESVVNYDogV2UgYXJlIG1vZGVyYXRlbHkgY29uZmlkZW50IHRoYXQgdGhpcyBjb3VudGVycGFydHkgd2FzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIGJ1dCBzb21lIGRldGFpbHMgbWF5IGRpZmZlciBmcm9tIG91ciByZWNvcmRzLiBgTE9XYDogV2UgZGlkbuKAmXQgZmluZCBhIG1hdGNoaW5nIGNvdW50ZXJwYXJ0eSBpbiBvdXIgcmVjb3Jkcywgc28gd2UgYXJlIHJldHVybmluZyBhIGNsZWFuc2VkIG5hbWUgcGFyc2VkIG91dCBvZiB0aGUgcmVxdWVzdCBkZXNjcmlwdGlvbi4gYFVOS05PV05gOiBXZSBkb27igJl0IGtub3cgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIHRoaXMgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5X2NvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluc2lnaHRzIGFyb3VuZCBhIHVzZXJcXCdzIGNvdW50ZXJwYXJ0aWVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHlJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEluc2lnaHRzIHJlbGF0ZWQgdG8gYSB1c2Vy4oCZcyB0cmFuc2FjdGlvbnMgd2l0aCBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgZmluYW5jaWFsX2luc3RpdHV0aW9uX2luc2lnaHRzPzogQXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgYWJvdXQgYSB1c2Vy4oCZcyB0b3AgbWVyY2hhbnRzLCByYW5rZWQgYnkgc3BlbmQuXG4gICAgICogQHR5cGUge0FycmF5PE1lcmNoYW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1lcmNoYW50X2luc2lnaHRzPzogQXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHkgdHlwZS4gIGBtZXJjaGFudGA6IGEgcHJvdmlkZXIgb2YgZ29vZHMgb3Igc2VydmljZXMgZm9yIHB1cmNoYXNlIGBmaW5hbmNpYWxfaW5zdGl0dXRpb25gOiBhIGZpbmFuY2lhbCBlbnRpdHkgKGJhbmssIGNyZWRpdCB1bmlvbiwgQk5QTCwgZmludGVjaCkgYHBheW1lbnRfYXBwYDogYSB0cmFuc2ZlciBvciBQMlAgYXBwIChlLmcuIFplbGxlKSBgbWFya2V0cGxhY2VgOiBhIG1hcmtldHBsYWNlIChlLmcgRG9vckRhc2gsIEdvb2dsZSBQbGF5IFN0b3JlKSBgcGF5bWVudF90ZXJtaW5hbGA6IGEgcG9pbnQtb2Ytc2FsZSBwYXltZW50IHRlcm1pbmFsIChlLmcgU3F1YXJlLCBUb2FzdCkgYGluY29tZV9zb3VyY2VgOiB0aGUgcGF5ZXIgaW4gYW4gaW5jb21lIHRyYW5zYWN0aW9uIChlLmcuLCBhbiBlbXBsb3llciwgY2xpZW50LCBvciBnb3Zlcm5tZW50IGFnZW5jeSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50ZXJwYXJ0eVR5cGUge1xuICAgIE1lcmNoYW50ID0gJ21lcmNoYW50JyxcbiAgICBGaW5hbmNpYWxJbnN0aXR1dGlvbiA9ICdmaW5hbmNpYWxfaW5zdGl0dXRpb24nLFxuICAgIFBheW1lbnRBcHAgPSAncGF5bWVudF9hcHAnLFxuICAgIE1hcmtldHBsYWNlID0gJ21hcmtldHBsYWNlJyxcbiAgICBQYXltZW50VGVybWluYWwgPSAncGF5bWVudF90ZXJtaW5hbCcsXG4gICAgSW5jb21lU291cmNlID0gJ2luY29tZV9zb3VyY2UnXG59XG5cbi8qKlxuICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50cnlDb2RlIHtcbiAgICBVcyA9ICdVUycsXG4gICAgR2IgPSAnR0InLFxuICAgIEVzID0gJ0VTJyxcbiAgICBObCA9ICdOTCcsXG4gICAgRnIgPSAnRlInLFxuICAgIEllID0gJ0lFJyxcbiAgICBDYSA9ICdDQScsXG4gICAgRGUgPSAnREUnLFxuICAgIEl0ID0gJ0lUJyxcbiAgICBQbCA9ICdQTCcsXG4gICAgRGsgPSAnREsnLFxuICAgIE5vID0gJ05PJyxcbiAgICBTZSA9ICdTRScsXG4gICAgRWUgPSAnRUUnLFxuICAgIEx0ID0gJ0xUJyxcbiAgICBMdiA9ICdMVicsXG4gICAgUHQgPSAnUFQnLFxuICAgIEJlID0gJ0JFJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEJhbmsgSW5jb21lIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgSXRlbXMgaW4gdGhlIHJlcG9ydCBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBpdGVtcz86IEFycmF5PENyYUJhbmtJbmNvbWVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zdW1tYXJ5PzogQ3JhQmFua0luY29tZVN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEluY29tZSByZXBvcnQgd2FzIHVuYWJsZSB0byBiZSByZXRyaWV2ZWQsIHRoZSB3YXJuaW5ncyB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgSXRlbVxcJ3MgYmFuayBhY2NvdW50cyB0aGF0IGhhdmUgdGhlIHNlbGVjdGVkIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogRGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIElkZW50aXR5IGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBzbyBmaWVsZCBtYXkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDYXVzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IENyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogV2UgdXNlIHN0YW5kYXJkIEhUVFAgcmVzcG9uc2UgY29kZXMgZm9yIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbm90aWZpY2F0aW9ucywgYW5kIG91ciBlcnJvcnMgYXJlIGZ1cnRoZXIgY2xhc3NpZmllZCBieSBgZXJyb3JfdHlwZWAuIEluIGdlbmVyYWwsIDIwMCBIVFRQIGNvZGVzIGNvcnJlc3BvbmQgdG8gc3VjY2VzcywgNDBYIGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZmFpbHVyZXMsIGFuZCA1MFggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGlzc3Vlcy4gRXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIG51bGwgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGdlbmVyYXRpb24gIGBTVUNDRVNTYDogVGhlIGJhbmsgaW5jb21lIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIGJhbmsgaW5jb21lIHJlcG9ydCBmYWlsZWQgdG8gYmUgZ2VuZXJhdGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyYS9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYENSQV9JTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUNvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lRW1wbG95ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFbXBsb3llciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogQXJyYXk8Q3JhQmFua0luY29tZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVuZCB1c2VyXFwncyBtb250aGx5IHN1bW1hcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBJbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2FjY291bnRzPzogQXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzPzogQXJyYXk8Q3JhQmFua0luY29tZVNvdXJjZT47XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0aGUgaW5jb21lIHNvdXJjZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk/OiBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlcyBpbiB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlcyBpbiB0aGUgdXNlcuKAmXMgYmFuayBhY2NvdW50IGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IENyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlIGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGluY29tZSBzb3VyY2Ugd2l0aGluIHRoZSBzdGFydCBhbmQgZW5kIGRhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCBkYXRlIG9mIHRoZSBlbmQgdXNlcuKAmXMgbmV4dCBwYXljaGVjayBmb3IgdGhlIGluY29tZSBzb3VyY2UuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVzdGltYXRlIG9mIHRoZSBhdmVyYWdlIGdyb3NzIG1vbnRobHkgaW5jb21lIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIG5ldCBhbW91bnQgYW5kIGluY29tZSBjYXRlZ29yeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2dyb3NzX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGF0YSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgbmV0IGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IENyYUJhbmtJbmNvbWVFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFN1bW1hcnkgZm9yIGJhbmsgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBncm9zcyBtb250aGx5IGluY29tZSBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBuZXQgYW1vdW50IGFuZCBpbmNvbWUgY2F0ZWdvcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2dyb3NzX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVdhcm5pbmdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlPzogQ3JhQmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBJREVOVElUWV9VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IGlkZW50aXR5IGZvciB0aGUgSXRlbSBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgdHJhbnNhY3Rpb25zIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIFJlcG9ydERlbGV0ZWQgPSAnUkVQT1JUX0RFTEVURUQnLFxuICAgIERhdGFVbmF2YWlsYWJsZSA9ICdEQVRBX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIDEwOTkgdGF4IGZvcm1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9ybTEwOTlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZm9ybV8xMDk5X3R5cGU/OiBGb3JtMTA5OVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBDcmVkaXQxMDk5UmVjaXBpZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5UGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcj86IENyZWRpdDEwOTlQYXllcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OUZpbGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlsZXI/OiBDcmVkaXQxMDk5RmlsZXI7XG4gICAgLyoqXG4gICAgICogVGF4IHllYXIgb2YgdGhlIHRheCBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIHJlbnQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcm95YWx0aWVzIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByb3lhbHRpZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBvdGhlciBpbmNvbWUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG90aGVyX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmaXNoaW5nIGJvYXQgcHJvY2VlZHMgZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlzaGluZ19ib2F0X3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbWVkaWNhbCBhbmQgaGVhbHRoY2FyZSBwYXltZW50cyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtZWRpY2FsX2FuZF9oZWFsdGhjYXJlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygbm9uZW1wbG95ZWUgY29tcGVuc2F0aW9uIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vbmVtcGxveWVlX2NvbXBlbnNhdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN1YnN0aXR1dGUgcGF5bWVudHMgbWFkZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3Vic3RpdHV0ZV9wYXltZW50c19pbl9saWV1X29mX2RpdmlkZW5kc19vcl9pbnRlcmVzdD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgcGF5ZXIgbWFkZSBkaXJlY3Qgc2FsZXMgb3ZlciAkNTAwMCBvZiBjb25zdW1lciBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfbWFkZV9kaXJlY3Rfc2FsZXNfb2ZfNTAwMF9vcl9tb3JlX29mX2NvbnN1bWVyX3Byb2R1Y3RzX3RvX2J1eWVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgY3JvcCBpbnN1cmFuY2UgcHJvY2VlZHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGNyb3BfaW5zdXJhbmNlX3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ29sZGVuIHBhcmFjaHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBleGNlc3NfZ29sZGVuX3BhcmFjaHV0ZV9wYXltZW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGdyb3NzIHByb2NlZWRzIHBhaWQgdG8gYW4gYXR0b3JuZXkgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX3Byb2NlZWRzX3BhaWRfdG9fYW5fYXR0b3JuZXk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGRlZmVycmFscyBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9kZWZlcnJhbHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGluY29tZSBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBzdGF0ZSB0YXggd2l0aGhlbGQgb2YgcGF5ZXIgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV90YXhfd2l0aGhlbGRfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9zdGF0ZV9udW1iZXJfbG93ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgcmVwb3J0ZWQgZm9yIHNlY29uZGFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX2xvd2VyPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkIFBheW1lbnQgY2FyZCBUaGlyZCBwYXJ0eSBuZXR3b3JrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19yZXBvcnRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgUFNFIChQYXltZW50IFNldHRsZW1lbnQgRW50aXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHNlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCAoWFhYKSBYWFgtWFhYWC4gUGhvbmUgbnVtYmVyIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgYW1vdW50IHJlcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBncm9zc19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBjYXJkIG5vdCBwcmVzZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY2FyZF9ub3RfcHJlc2VudF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lcmNoYW50X2NhdGVnb3J5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfcGF5bWVudF90cmFuc2FjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSmFudWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgamFudWFyeV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgRmVicnVhcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlYnJ1YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXJjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWFyY2hfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEFwcmlsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhcHJpbF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTWF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bmVfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bHlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEF1Z3VzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgYXVndXN0X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBTZXB0ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlcHRlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgT2N0b2Jlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb2N0b2Jlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTm92ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vdmVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBEZWNlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZGVjZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIG9mIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSB0YXggcmVwb3J0ZWQgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlciB1c2VkIGJ5IDEwOTktSyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTlGaWxlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkOiBQYXltZW50IFNldHRsZW1lbnQgRW50aXR5IChQU0UpLCBFbGVjdHJvbmljIFBheW1lbnQgRmFjaWxpdGF0b3IgKEVQRiksIE90aGVyIFRoaXJkIFBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXllciB1c2VkIGJ5IDEwOTktTUlTQyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTlQYXllciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbGVwaG9uZSBudW1iZXIgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZWNpcGllbnQgdXNlZCBpbiBib3RoIDEwOTktSyBhbmQgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRheCBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaGVja2VkIGlmIEZBQ1RBIGlzIGEgZmlsaW5nIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmYWN0YV9maWxpbmdfcmVxdWlyZW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgMm5kIFRJTiBleGlzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHNlY29uZF90aW5fZXhpc3RzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGNyZWRpdCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWNyZWRpdCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBY2NvdW50U3VidHlwZSB7XG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBUaGlzIGNvbnRhaW5zIGFuIGFtb3VudCwgZGVub21pbmF0ZWQgaW4gdGhlIGN1cnJlbmN5IHNwZWNpZmllZCBieSBlaXRoZXIgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiByZXBvcnQgdG9rZW5zOyBjYW4gaW5jbHVkZSBhdCBtb3N0IG9uZSBWT0Evc3RhbmRhcmQgQXNzZXQgUmVwb3J0IHRva2VucyBhbmQgb25lIFZPRSBBc3NldCBSZXBvcnQgVG9rZW4uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90b2tlbnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yLCB3aGljaCBhbGxvd3MgdGhlbSB0byBmZXRjaCB0aGUgQXNzZXQgUmVwb3J0cyBhdHRhY2hlZCB0byB0aGUgdG9rZW4uIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRva2VucyB3aGljaCB0aGUgc3BlY2lmaWVkIEF1ZGl0IENvcHkgVG9rZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGguIFRoZSB0eXBlcyBvZiB0b2tlbiBzdXBwb3J0ZWQgYXJlIGFzc2V0IHJlcG9ydCB0b2tlbiBhbmQgZW1wbG95bWVudCByZXBvcnQgdG9rZW4uIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDEgb2YgZWFjaCB0b2tlbiB0eXBlIGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBdWRpdCBDb3B5IFRva2VuIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3llclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0aGUgYmFuayBlbXBsb3ltZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEJhbmtFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBsYXRlc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGRlcG9zaXQgZnJvbSB0aGlzIGVtcGxveWVyIGZyb20gd2l0aGluIHRoZSBwZXJpb2Qgb2YgdGhlIGRheXMgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZWFybGllc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQmFuayBFbXBsb3ltZW50IGRhdGEuIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHdpbGwgYmUgYSBkaXN0aW5jdCBiYW5rIGVtcGxveW1lbnQgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfcmVwb3J0czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYmFuayBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgZGlmZmVyZW50IGVtcGxveWVyIGZvdW5kLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudHM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgRW1wbG95bWVudCBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+O1xufVxuLyoqXG4gKiBUaGUgcmVwb3J0IG9mIHRoZSBCYW5rIEVtcGxveW1lbnQgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0IHdhcyBnZW5lcmF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEVtcGxveW1lbnQgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ3JlZGl0QmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0VNUExPWU1FTlRfV0FSTklOR2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlIHtcbiAgICBCYW5rRW1wbG95bWVudFdhcm5pbmcgPSAnQkFOS19FTVBMT1lNRU5UX1dBUk5JTkcnXG59XG5cbi8qKlxuICogVGhlIHJlcG9ydCBvZiB0aGUgQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgQmFuayBJbmNvbWUgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIEJhbmsgSW5jb21lIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz47XG59XG4vKipcbiAqIFRoZSBJdGVtXFwncyBiYW5rIGFjY291bnRzIHRoYXQgaGF2ZSB0aGUgc2VsZWN0ZWQgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUaGUgYWNjb3VudCB0eXBlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGBkZXBvc2l0b3J5YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZSB7XG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5J1xufVxuXG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkuIE5vdGUgdGhhdCB0aGUgYENBU0hgIHZhbHVlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGlzIHVzZWQgb25seSBmb3IgZXhpc3RpbmcgbGVnYWN5IGltcGxlbWVudGF0aW9ucy4gSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG5ldyBjYXRlZ29yaWVzIGBDQVNIX0RFUE9TSVRgIChyZXByZXNlbnRpbmcgY2FzaCBvciBjaGVjayBkZXBvc2l0cykgYW5kIGBUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OYCAocmVwcmVzZW50aW5nIGNhc2ggdHJhbnNmZXJzIG9yaWdpbmF0aW5nIGZyb20gYXBwcywgc3VjaCBhcyBaZWxsZSBvciBWZW5tbykuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnkge1xuICAgIFNhbGFyeSA9ICdTQUxBUlknLFxuICAgIFVuZW1wbG95bWVudCA9ICdVTkVNUExPWU1FTlQnLFxuICAgIENhc2ggPSAnQ0FTSCcsXG4gICAgR2lnRWNvbm9teSA9ICdHSUdfRUNPTk9NWScsXG4gICAgUmVudGFsID0gJ1JFTlRBTCcsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NISUxEX1NVUFBPUlQnLFxuICAgIE1pbGl0YXJ5ID0gJ01JTElUQVJZJyxcbiAgICBSZXRpcmVtZW50ID0gJ1JFVElSRU1FTlQnLFxuICAgIExvbmdUZXJtRGlzYWJpbGl0eSA9ICdMT05HX1RFUk1fRElTQUJJTElUWScsXG4gICAgQmFua0ludGVyZXN0ID0gJ0JBTktfSU5URVJFU1QnLFxuICAgIENhc2hEZXBvc2l0ID0gJ0NBU0hfREVQT1NJVCcsXG4gICAgVHJhbnNmZXJGcm9tQXBwbGljYXRpb24gPSAnVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTicsXG4gICAgVGF4UmVmdW5kID0gJ1RBWF9SRUZVTkQnLFxuICAgIEJlbmVmaXRPdGhlciA9ICdCRU5FRklUX09USEVSJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3YXJuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlIHtcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gICAgSW5zdWZmaWNpZW50Q3JlZGVudGlhbHMgPSAnSU5TVUZGSUNJRU5UX0NSRURFTlRJQUxTJyxcbiAgICBJdGVtTG9ja2VkID0gJ0lURU1fTE9DS0VEJyxcbiAgICBVc2VyU2V0dXBSZXF1aXJlZCA9ICdVU0VSX1NFVFVQX1JFUVVJUkVEJyxcbiAgICBDb3VudHJ5Tm90U3VwcG9ydGVkID0gJ0NPVU5UUllfTk9UX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Eb3duID0gJ0lOU1RJVFVUSU9OX0RPV04nLFxuICAgIEluc3RpdHV0aW9uTm9Mb25nZXJTdXBwb3J0ZWQgPSAnSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Ob3RSZXNwb25kaW5nID0gJ0lOU1RJVFVUSU9OX05PVF9SRVNQT05ESU5HJyxcbiAgICBJbnZhbGlkQ3JlZGVudGlhbHMgPSAnSU5WQUxJRF9DUkVERU5USUFMUycsXG4gICAgSW52YWxpZE1mYSA9ICdJTlZBTElEX01GQScsXG4gICAgSW52YWxpZFNlbmRNZXRob2QgPSAnSU5WQUxJRF9TRU5EX01FVEhPRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgTWZhTm90U3VwcG9ydGVkID0gJ01GQV9OT1RfU1VQUE9SVEVEJyxcbiAgICBOb0FjY291bnRzID0gJ05PX0FDQ09VTlRTJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgQWNjZXNzTm90R3JhbnRlZCA9ICdBQ0NFU1NfTk9UX0dSQU5URUQnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgQmFuayBJbmNvbWUgUmVwb3J0cyBzaG91bGQgYmUgZmV0Y2hlZC4gTXVsdGlwbGUgcmVwb3J0cyBtYXkgYmUgYXZhaWxhYmxlIGlmIHRoZSByZXBvcnQgaGFzIGJlZW4gcmUtY3JlYXRlZCBvciByZWZyZXNoZWQuIElmIG1vcmUgdGhhbiBvbmUgcmVwb3J0IGlzIGF2YWlsYWJsZSwgdGhlIG1vc3QgcmVjZW50IHJlcG9ydHMgd2lsbCBiZSByZXR1cm5lZCBmaXJzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW5kIHVzZXJcXCdzIG1vbnRobHkgc3VtbWFyeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKSBvZiB0aGUgdXNlciBmb3IgdGhlIG1vbnRoIGluIHRoZSBzdW1tYXJ5LiBUaGlzIG1heSByZXR1cm4gYW4gaW5jb3JyZWN0IHZhbHVlIGlmIHRoZSBzdW1tYXJ5IGluY2x1ZGVzIGluY29tZSBzb3VyY2VzIGluIG11bHRpcGxlIGN1cnJlbmNpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1pdGVtcy1iYW5rLWluY29tZS1zb3VyY2VzLWhpc3RvcmljYWwtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1pdGVtcy1iYW5rLWluY29tZS1zb3VyY2VzLWhpc3RvcmljYWwtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgSW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50cz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc291cmNlcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVTb3VyY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIHBheSBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5IHtcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIERhaWx5ID0gJ0RBSUxZJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgZGF5cyBvZiBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIHJlZnJlc2guIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB0aGUgbW9zdCByZWNlbnRseSBnZW5lcmF0ZWQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluY29tZSBzb3VyY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIG5hbWUgb3Igb3JpZ2luYWwgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIGluY29tZSB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5PzogQ3JlZGl0QmFua0luY29tZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWluaW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlcyBpbiB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSBvZiBhbGwgZGF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlcyBpbiB0aGUgdXNlcuKAmXMgYmFuayBhY2NvdW50IGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IENyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIHRoZSBzcGVjaWZpYyBpbmNvbWUgc291cmNlIGZvciBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGluY29tZSBzb3VyY2Ugd2l0aGluIHRoZSBzdGFydCBhbmQgZW5kIGRhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgYmFuayBpbmNvbWUgYWNyb3NzIGFsbCBpbmNvbWUgc291cmNlcyBhbmQgaXRlbXMgKG1heCBoaXN0b3J5IG9mIDczMCBkYXlzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIG1heSByZXR1cm4gYW4gaW5jb3JyZWN0IHZhbHVlIGlmIHRoZSBzdW1tYXJ5IGluY2x1ZGVzIGluY29tZSBzb3VyY2VzIGluIG11bHRpcGxlIGN1cnJlbmNpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgYWNyb3NzIGFsbCB0aGUgaW5jb21lIHNvdXJjZXMgaW4gdGhlIGVuZCB1c2VyXFwncyBJdGVtcyBmb3IgdGhlIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIHdpdGhpbiB0aGUgZGF5cyByZXF1ZXN0ZWQgaW4gd2hpY2ggYWxsIGluY29tZSBzb3VyY2VzIGlkZW50aWZpZWQgYnkgUGxhaWQgYXBwZWFyIGluIGEgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgaW4gd2hpY2ggYWxsIGluY29tZSBzb3VyY2VzIGlkZW50aWZpZWQgYnkgUGxhaWQgYXBwZWFyIGluIHRoZSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBjYXRlZ29yaWVzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yaWVzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgdHJhbnNhY3Rpb25zIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV90cmFuc2FjdGlvbnNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U/OiBDcmVkaXRCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYElERU5USVRZX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgaWRlbnRpdHkgZm9yIHRoZSBJdGVtIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBJdGVtIGBJVEVNX1VOQVBQUk9WRURgOiBVc2VyIGV4aXRlZCBmbG93IGJlZm9yZSBnaXZpbmcgcGVybWlzc2lvbiB0byBzaGFyZSBkYXRhIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIEl0ZW1VbmFwcHJvdmVkID0gJ0lURU1fVU5BUFBST1ZFRCcsXG4gICAgUmVwb3J0RGVsZXRlZCA9ICdSRVBPUlRfREVMRVRFRCcsXG4gICAgRGF0YVVuYXZhaWxhYmxlID0gJ0RBVEFfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19JTkNPTUVfV0FSTklOR2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGUge1xuICAgIEJhbmtJbmNvbWVXYXJuaW5nID0gJ0JBTktfSU5DT01FX1dBUk5JTkcnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZCB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kaW5nIGJhbGFuY2Ugb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRpbmdfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgc3RhdGVtZW50IHVwbG9hZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgYmFua19zdGF0ZW1lbnRzOiBBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEl0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXlyb2xsSXRlbVN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBJdGVtIHdhcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBmcm9tIGEgdXNlci11cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHRyYW5zYWN0aW9ucyBhcHBlYXJpbmcgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGJhbmsgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdFxuICAgICAqL1xuICAgIGJhbmtfYWNjb3VudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudD47XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB0cmFuc2FjdGlvbiBhcHBlYXJpbmcgb24gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBiYW5rIHN0YXRlbWVudCB1cGxvYWQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNyZWRpdCBjYXJkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdENhcmRMaWFiaWxpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhcmRMaWFiaWxpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YXJpb3VzIGludGVyZXN0IHJhdGVzIHRoYXQgYXBwbHkgdG8gdGhlIGFjY291bnQuIEFQUiBpbmZvcm1hdGlvbiBpcyBub3QgcHJvdmlkZWQgYnkgYWxsIGNhcmQgaXNzdWVyczsgaWYgQVBSIGRhdGEgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxBUFI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYXByczogQXJyYXk8QVBSPjtcbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIGEgcGF5bWVudCBpcyBjdXJyZW50bHkgb3ZlcmR1ZS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3QgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb3dlZCBhcyBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQgaXNzdWVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gcGF5bWVudCBkdWUgZm9yIHRoZSBuZXh0IGJpbGxpbmcgY3ljbGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgZHVlIGRhdGUgaXMgYG51bGxgIGlmIGEgcGF5bWVudCBpcyBub3QgZXhwZWN0ZWQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIE1vc3QgcmVsZXZhbnQgZm9yIGNyZWRpdCB1c2UgY2FzZXMsIGJ1dCBub3QgbGltaXRlZCB0byBzdWNoIHVzZSBjYXNlcy4gIFNlZSB0aGUgW2B0YXhvbm9teSBjc3YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9jcmVkaXQtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgY3JlZGl0IGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhdGVnb3J5XG4gICAgICovXG4gICAgcHJpbWFyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZ3JhbnVsYXIgY2F0ZWdvcnkgY29udmV5aW5nIHRoZSB0cmFuc2FjdGlvblxcJ3MgaW50ZW50LiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IHJlcHJlc2VudGluZyBtZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGRvY3VtZW50LiAgYFBBWVNUVUJgOiBBIHBheXN0dWIuICBgQkFOS19TVEFURU1FTlRgOiBBIGJhbmsgc3RhdGVtZW50LiAgYFVTX1RBWF9XMmA6IEEgVy0yIHdhZ2UgYW5kIHRheCBzdGF0ZW1lbnQgcHJvdmlkZWQgYnkgYSBVUyBlbXBsb3llciByZWZsZWN0aW5nIHdhZ2VzIGVhcm5lZCBieSB0aGUgZW1wbG95ZWUuICBgVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBVU19NSUxJVEFSWV9MRVNgOiBBIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0ZW1lbnQgKExFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBVU19NSUxJVEFSWV9DTEVTYDogQSBDaXZpbGlhbiBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdG1lbnQgKENMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgR0lHYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpbmNvbWUgaXMgcmVsYXRlZCB0byBnaWcgd29yay4gRG9lcyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhIHNwZWNpZmljIGRvY3VtZW50IHR5cGUuICBgUExBSURfR0VORVJBVEVEX1BBWVNUVUJfUERGYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBQREYgZm9yIHRoZSBwYXlzdHViIHdhcyBnZW5lcmF0ZWQgYnkgUGxhaWQuICBgTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBVTktOT1dOYDogRG9jdW1lbnQgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTaWduZWQgVVJMIHRvIHJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIGZpbGUuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIGZpbGUgdHlwZSB3aWxsIGFsd2F5cyBiZSBQREYsIGFuZCB0aGUgZmlsZSBtYXkgbm90IGJlIGF2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZmllbGQgd2lsbCBiZSBgbnVsbGAuIElmIHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGdlbmVyYXRlIGEgUERGIGlmIHRoZSBvcmlnaW5hbCBpcyBub3QgYXZhaWxhYmxlLCBjb250YWN0IHlvdXIgQWNjb3VudCBNYW5hZ2VyLiBGb3IgRG9jdW1lbnQgSW5jb21lLCB0aGlzIGZpZWxkIHdpbGwgbm90IGJlIGBudWxsYCwgYW5kIHRoZSBmaWxlIHR5cGUgd2lsbCBiZSB0aGUgb3JpZ2luYWwgZmlsZSB0eXBlIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLiBGb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBmaWxlIHR5cGVzLCBzZWUgdGhlIFtEb2N1bWVudCBJbmNvbWVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2luY29tZS9wYXlyb2xsLWluY29tZSkgZG9jdW1lbnRhdGlvbi4gIFRoaXMgZG93bmxvYWQgVVJMIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBhbmQgZXhwaXJlcyBhZnRlciB0d28gbWludXRlcy4gVG8gZ2VuZXJhdGUgYSBuZXcgZG93bmxvYWQgVVJMLCBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgYWdhaW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvd25sb2FkX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudCAoaWYgYXZhaWxhYmxlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbXBsb3ltZW50IGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveW1lbnQgaXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50SXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRva2VuIHRvIHJlcHJlc2VudCB0aGUgdW5kZXJseWluZyBFbXBsb3ltZW50IGRhdGFcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZCBvZiBlbXBsb3ltZW50LCBpZiBhcHBsaWNhYmxlLiBQcm92aWRlZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGxhdGZvcm1JZHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwbGF0Zm9ybV9pZHM6IENyZWRpdFBsYXRmb3JtSWRzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGVtcGxveW1lbnQgZm9yIHRoZSBpbmRpdmlkdWFsLiBgXFxcIkZVTExfVElNRVxcXCJgOiBBIGZ1bGwtdGltZSBlbXBsb3llZS4gYFxcXCJQQVJUX1RJTUVcXFwiYDogQSBwYXJ0LXRpbWUgZW1wbG95ZWUuIGBcXFwiQ09OVFJBQ1RPUlxcXCJgOiBBbiBlbXBsb3llZSB0eXBpY2FsbHkgaGlyZWQgZXh0ZXJuYWxseSB0aHJvdWdoIGEgY29udHJhY3RpbmcgZ3JvdXAuIGBcXFwiVEVNUE9SQVJZXFxcImA6IEEgdGVtcG9yYXJ5IGVtcGxveWVlLiBgXFxcIk9USEVSXFxcImA6IFRoZSBlbXBsb3llZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgdHlwZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVlX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVtcGxveWVlXFwncyBtb3N0IHJlY2VudCBwYXlzdHViIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGxhc3RfcGF5c3R1Yl9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfT1dORVJTOiBBc3NldE93bmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0hPTERFUjogQXNzZXRIb2xkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05TOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZhbGlkYXRpb25Tb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nLi4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFVEFJTDogQXNzZXRUcmFuc2FjdGlvbkRldGFpbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTjogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIEZpcnN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTWlkZGxlTmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycztcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGxvYW4uIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBcXFwiU3ViamVjdExvYW5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMb2FuUm9sZVR5cGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PExvYW5JZGVudGlmaWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogQXJyYXk8TG9hbklkZW50aWZpZXI+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbG9hbnMgdGhhdCBhcmUgcGFydCBvZiBhIHNpbmdsZSBkZWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zXG4gICAgICovXG4gICAgTE9BTjogQ3JlZGl0RnJlZGRpZU1hY0xvYW47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydGllcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGFydHkgdG8gYSB0cmFuc2FjdGlvbi4gSW5jbHVkZWQgZGlyZWN0IHBhcnRpY2lwYW50cyBsaWtlIHRoZSBib3Jyb3dlciBhbmQgc2VsbGVyIGFzIHdlbGwgYXMgaW5kaXJlY3QgcGFydGljaXBhbnRzIHN1Y2ggYXMgdGhlIGZsb29kIGNlcnRpZmljYXRlIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gICAgICovXG4gICAgUk9MRVM6IFJvbGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbFxuICAgICAqL1xuICAgIE5BTUU6IENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydERhdGVUaW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJSZXBvcnRJRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRJZGVudGlmaWVyVHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25QYXJlbnRJZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXI6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvZnJlZGRpZV9tYWMvcmVwb3J0cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIERFQUw6IENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMgKFZPQSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIFNjaGVtYVZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGRldGFpbHMgcmVsYXRlZCB0byBhIGZ1bGZpbGxtZW50IHNlcnZpY2Ugb3IgcHJvZHVjdCBpbiB0ZXJtcyBvZiByZXF1ZXN0LCBwcm9jZXNzIGFuZCByZXN1bHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gICAgICovXG4gICAgVkVSSUZJQ0FUSU9OX09GX0FTU0VUOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICAgICAqL1xuICAgIFNUQVRVU0VTOiBTdGF0dXNlcztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc1xuICAgICAqL1xuICAgIFNFUlZJQ0U6IENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgUkVQT1JUSU5HX0lORk9STUFUSU9OOiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVF9SRVNQT05TRTogQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBBU1NFVFM6IENyZWRpdEZyZWRkaWVNYWNBc3NldHM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIExPQU5TOiBDcmVkaXRGcmVkZGllTWFjTG9hbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgUEFSVElFUzogQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFNFUlZJQ0VTOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJEZWR1Y3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZGVkdWN0aW9uczogQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzOiBDcmVkaXRQYXlTdHViRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRQYXlTdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJOZXRQYXl9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBuZXRfcGF5OiBDcmVkaXRQYXlTdHViTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViUGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlsczogUGF5U3R1YlBheVBlcmlvZERldGFpbHM7XG59XG4vKipcbiAqIEFkZHJlc3Mgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8UGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViRGVkdWN0aW9uc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsOiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXkgc3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRWFybmluZ3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5ncyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRWFybmluZ3NcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PFBheVN0dWJFYXJuaW5nc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbDogUGF5U3R1YkVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzczogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWFyaXRhbCBzdGF0dXMgb2YgdGhlIGVtcGxveWVlIC0gZWl0aGVyIGBTSU5HTEVgIG9yIGBNQVJSSUVEYCBvciBgTk9UIExJU1RFRGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICB0YXhwYXllcl9pZDogUGF5U3R1YlRheHBheWVySUQ7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbXBsb3llciBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgb24gdGhlIHBheSBzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldCBwYXkgYW1vdW50IG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1Yk5ldFBheSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIG5ldCBwYXkgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZXhwbGljaXQgcGF5IGJhc2lzIG9uIHRoZSBwYXlzdHViIChpZiBwcmVzZW50KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGUge1xuICAgIFNhbGFyeSA9ICdTQUxBUlknLFxuICAgIEhvdXJseSA9ICdIT1VSTFknLFxuICAgIENvbW1pc3Npb24gPSAnQ09NTUlTU0lPTidcbn1cblxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2UgYm9keSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxQYXlyb2xsSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9kb2N1bWVudHMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBhbmFseXNpcyB0byBlbmFibGUgZm9yIHRoZSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uIHNlc3Npb25cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlnOiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPjtcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2RvY3VtZW50cy91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyBiZWxvbmdpbmcgdG8gdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoZSBJdGVtcyBzcGVjaWZpZWQgaGVyZSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgcHJvdmlkaW5nIHRoZW0gaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIHRoZXNlIEl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggKGFuZCBiaWxsZWQgZm9yKSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luc3RpdHV0aW9uPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlkZW5jZTogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZXF1ZXN0IG9wdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgdG8gYmUgcmVmcmVzaGVkLiBFYWNoIGBpdGVtX2lkYCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCBiZSByZWZyZXNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB3aGVyZSBQbGFpZCB3aWxsIHNlbmQgdGhlIHBheXJvbGwgaW5jb21lIHJlZnJlc2ggd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVVNFUl9QUkVTRU5DRV9SRVFVSVJFRFxcXCJgIFVzZXIgcHJlc2VuY2UgaXMgcmVxdWlyZWQgdG8gcmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uLiBgXFxcIlNVQ0NFU1NGVUxcXFwiYCBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoIHdhcyBzdWNjZXNzZnVsLiBgXFxcIk5PVF9GT1VORFxcXCJgIE5vIG5ldyBkYXRhIHdhcyBmb3VuZCBhZnRlciB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fcmVmcmVzaF9zdGF0dXM6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbFJpc2tTaWduYWxzSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBsYXRmb3JtSWRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgZW1wbG95ZWVfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcG9zaXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHJlcG9ydCB0b2tlbiBzdHJpbmdzLCB3aXRoIGF0IG1vc3Qgb25lIHRva2VuIG9mIGVhY2ggcmVwb3J0IHR5cGUuIEN1cnJlbnRseSBvbmx5IEFzc2V0IFJlcG9ydCB0b2tlbiBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90b2tlbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWNvbmRhcnlfY2xpZW50X2lkYCBpcyB0aGUgY2xpZW50IGlkIG9mIHRoZSB0aGlyZCBwYXJ0eSB3aXRoIHdob20geW91IHdvdWxkIGxpa2UgdG8gc2hhcmUgdGhlIHJlbGF5IHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY29uZGFyeV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIHdlYmhvb2tzIHdoZW4gdGhlIFNlY29uZGFyeSBDbGllbnQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlcyBhbiBBc3NldCBSZXBvcnQgYnkgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IHRvIGFsbG93IHRoZW0gdG8gYWNjZXNzIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgcmVsYXkgdG9rZW4gd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgYW5kIHJlc3VsdHMgZm9yIGEgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIExpbmsgc2Vzc2lvbi4gVGhpcyBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIGBsaW5rX3Nlc3Npb25faWRgIHJldHVybmVkIGluIHRoZSBvblN1Y2Nlc3Mvb25FeGl0IGNhbGxiYWNrcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIExpbmsgc2Vzc2lvbiBzdGFydGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHNlc3Npb25fc3RhcnRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvblJlc3VsdHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICByZXN1bHRzPzogQ3JlZGl0U2Vzc2lvblJlc3VsdHM7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBlcnJvcnMgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIGVycm9ycz86IEFycmF5PENyZWRpdFNlc3Npb25FcnJvcj47XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbiBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgZW1wbG95bWVudC4gIGBOT19FTVBMT1lNRU5UU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGVtcGxveW1lbnQgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYEVNUExPWUVSX05PVF9MSVNURURgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZGlkIG5vdCBzZWUgdGhlaXIgY3VycmVudCBvciBwcmV2aW91cyBlbXBsb3llciBpbiB0aGUgbGlzdCBvZiBlbXBsb3llciBuYW1lcyBmb3VuZC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9FbXBsb3llcnNGb3VuZCA9ICdOT19FTVBMT1lFUlNfRk9VTkQnLFxuICAgIEVtcGxveWVyTm90TGlzdGVkID0gJ0VNUExPWUVSX05PVF9MSVNURUQnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgQmFuayBJbmNvbWUgTGluayBzZXNzaW9uLiAgYEFQUFJPVkVEYDogVXNlciBoYXMgYXBwcm92ZWQgYW5kIHZlcmlmaWVkIHRoZWlyIGluY29tZSAgYE5PX0RFUE9TSVRTX0ZPVU5EYDogV2UgYXR0ZW1wdGVkLCBidXQgd2VyZSB1bmFibGUgdG8gZmluZCBhbnkgaW5jb21lIGluIHRoZSBjb25uZWN0ZWQgYWNjb3VudC4gIGBVU0VSX1JFUE9SVEVEX05PX0lOQ09NRWA6IFRoZSB1c2VyIGV4cGxpY2l0bHkgaW5kaWNhdGVkIHRoYXQgdGhleSBkb25cXCd0IHJlY2VpdmUgaW5jb21lIGluIHRoZSBjb25uZWN0ZWQgYWNjb3VudC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXMge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBOb0RlcG9zaXRzRm91bmQgPSAnTk9fREVQT1NJVFNfRk9VTkQnLFxuICAgIFVzZXJSZXBvcnRlZE5vSW5jb21lID0gJ1VTRVJfUkVQT1JURURfTk9fSU5DT01FJ1xufVxuXG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9wYXlzdHVic191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdzJzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fYmFua19zdGF0ZW1lbnRzX3VwbG9hZGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgTGluayBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGFuIEl0ZW0gYWRkIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHcycyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEluc3RpdHV0aW9uIE5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNldCBvZiByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25SZXN1bHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIEl0ZW0gYWRkcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGl0ZW1fYWRkX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgZW1wbG95bWVudCB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZV9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgZG9jdW1lbnRfaW5jb21lX3Jlc3VsdHM/OiBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgTGluayBzZXNzaW9ucyBmb3IgdGhlIHVzZXIuIFNlc3Npb25zIHdpbGwgYmUgc29ydGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZXNzaW9ucz86IEFycmF5PENyZWRpdFNlc3Npb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXMiBpcyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGluY29tZSBkYXRhIHRha2VuIGZyb20gYSBXMiB0YXggZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFcyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRXMiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhOiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRQYXlTdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogQ3JlZGl0UGF5U3R1YkVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggeWVhciBvZiB0aGUgVzIgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB0YXhfeWVhcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBlbXBsb3llZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb3IgRUlOLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBzZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSBtZWRpY2FyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1lZGljYXJlIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvY2F0ZWQgdGlwcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvbnRlbnRzIGZyb20gYm94IDkgb24gdGhlIFcyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94Xzk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOb25xdWFsaWZpZWQgcGxhbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyQm94MTI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGJveF8xMjogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJldGlyZW1lbnQgcGxhbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHJldGlyZW1lbnRfcGxhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlyZCBwYXJ0eSBzaWNrIHBheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3NpY2tfcGF5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgb3RoZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM6IEFycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPjtcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDVcXFwiLCBcXFwiUjA3XFxcIiwgXFxcIlIxMFxcXCIsIFxcXCJSMTFcXFwiLCBcXFwiUjI5XFxcIi4gVGhlc2UgcmV0dXJucyB0eXBpY2FsbHkgaGF2ZSBhIHJldHVybiB0aW1lIGZyYW1lIG9mIHVwIHRvIDYwIGNhbGVuZGFyIGRheXMuIER1cmluZyB0aGlzIHBlcmlvZCwgdGhlIGN1c3RvbWVyIG9mIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY2FuIGRpc3B1dGUgYSB0cmFuc2FjdGlvbiBhcyB1bmF1dGhvcml6ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHRpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdGVkIGxpa2VsaWhvb2QgdGhhdCB0aGUgdHJhbnNhY3Rpb24sIGlmIGluaXRpYXRlZCwgd2lsbCBiZSBzdWJqZWN0IHRvIGEgcmV0dXJuLiAgSW4gdGhlIGBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGZpdmUgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAwJSAtIDAuMDIlICAgMjogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAyJSAtIDAuMDUlICAgMzogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjA1JSAtIDAuMSUgICA0OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMSUgLSAwLjUlICAgNTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDAuNSUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIEFjY291bnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgdGVhbSBtZW1iZXIgd2l0aCBhY2Nlc3MgdG8gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Rhc2hib2FyZFVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IERhc2hib2FyZFVzZXJTdGF0dXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgZGFzaGJvYXJkIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Rhc2hib2FyZFVzZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGRhc2hib2FyZCB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGRhc2hib2FyZCB1c2Vyc1xuICAgICAqIEB0eXBlIHtBcnJheTxEYXNoYm9hcmRVc2VyPn1cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyczogQXJyYXk8RGFzaGJvYXJkVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRGFzaGJvYXJkVXNlclN0YXR1cyB7XG4gICAgSW52aXRlZCA9ICdpbnZpdGVkJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBEZWFjdGl2YXRlZCA9ICdkZWFjdGl2YXRlZCdcbn1cblxuLyoqXG4gKiBBIGRhdGUgcmFuZ2Ugd2l0aCBhIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXRlUmFuZ2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERhdGVSYW5nZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBiZWdpbm5pbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGF0ZVJhbmdlXG4gICAgICovXG4gICAgZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8RGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnNUb3RhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlIGZvciBhbiBJdGVtLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSB0aGUgd2ViaG9vayByZWxhdGVzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnR9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGFyZ2V0X2FjY291bnQ6IERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfdXNlcjogRGVwb3NpdFN3aXRjaFRhcmdldFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgSXRlbSwgdHlwaWNhbGx5IHByb3ZpZGVkIGluIHRoZSBJbXBvcnQgSXRlbSByZXNwb25zZS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWQgQWNjb3VudCBJRCB0aGF0IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGJhbmsgYWNjb3VudC4gVGhpcyBhY2NvdW50IHdpbGwgYmVjb21lIHRoZSByZWNpcGllbnQgZm9yIGEgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RDb3VudHJ5Q29kZUVudW0ge1xuICAgIFVzID0gJ1VTJyxcbiAgICBDYSA9ICdDQSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgc3RhdHVzIG9mIGEgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgY2hhbmdlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9uIGl0ZW1zIHRvIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gbWF0Y2ggdGhlIHVzZXIgdG8gdGhlaXIgUGF5cm9sbCBQcm92aWRlci4gVGhlc2UgdG9rZW5zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgc2FtZSBjbGllbnQgaWQgYXMgdGhlIG9uZSBjcmVhdGluZyB0aGUgc3dpdGNoLCBhbmQgaGF2ZSBhY2Nlc3MgdG8gdGhlIHRyYW5zYWN0aW9ucyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pdGVtX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBiYW5rIGFjY291bnQgdGhlIGRpcmVjdCBkZXBvc2l0IHdhcyBzd2l0Y2hlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEl0ZW0gdGhlIGRpcmVjdCBkZXBvc2l0IHdhcyBzd2l0Y2hlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXJnZXRfaXRlbV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlLCBvciBzdGF0dXMsIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gIC0gYGluaXRpYWxpemVkYCDigJMgVGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIHVzZXIgZW50ZXJpbmcgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHN1Ym1pdCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIC0gYHByb2Nlc3NpbmdgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgYmVlbiBzdWJtaXR0ZWQgYW5kIGlzIGJlaW5nIHByb2Nlc3NlZC4gIC0gYGNvbXBsZXRlZGAg4oCTIFRoZSB1c2VyXFwncyBlbXBsb3llciBoYXMgZnVsZmlsbGVkIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgZXJyb3JgIOKAkyBUaGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0ZTogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3RhdGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2QgdXNlZCB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC4gIC0gYGluc3RhbnRgIOKAkyBVc2VyIGluc3RhbnRseSBzd2l0Y2hlZCB0aGVpciBkaXJlY3QgZGVwb3NpdCB0byBhIG5ldyBvciBleGlzdGluZyBiYW5rIGFjY291bnQgYnkgY29ubmVjdGluZyB0aGVpciBwYXlyb2xsIG9yIGVtcGxveWVyIGFjY291bnQuICAtIGBtYWlsYCDigJMgVXNlciByZXF1ZXN0ZWQgdGhhdCBQbGFpZCBjb250YWN0IHRoZWlyIGVtcGxveWVyIGJ5IG1haWwgdG8gbWFrZSB0aGUgZGlyZWN0IGRlcG9zaXQgc3dpdGNoLiAgLSBgcGRmYCDigJMgVXNlciBnZW5lcmF0ZWQgYSBQREYgb3IgZW1haWwgdG8gYmUgc2VudCB0byB0aGVpciBlbXBsb3llciB3aXRoIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgZGVwb3NpdCBzd2l0Y2guXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dpdGNoX21ldGhvZD86IERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVN3aXRjaE1ldGhvZEVudW07XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHVzZXLigJlzIGRpcmVjdCBkZXBvc2l0IGdvZXMgdG8gbXVsdGlwbGUgYmFua3MuIFdoZW4gZmFsc2UsIHVzZXLigJlzIGRpcmVjdCBkZXBvc2l0IG9ubHkgZ29lcyB0byB0aGUgdGFyZ2V0IGFjY291bnQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaGFzX211bHRpcGxlX2FsbG9jYXRpb25zOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRhcmdldCBhY2NvdW50IGlzIGFsbG9jYXRlZCB0aGUgcmVtYWluZGVyIG9mIGRpcmVjdCBkZXBvc2l0IGFmdGVyIGFsbCBvdGhlciBhbGxvY2F0aW9ucyBoYXZlIGJlZW4gZGVkdWN0ZWQuIFdoZW4gYGZhbHNlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgaXMgYWxsb2NhdGVkIGFzIGEgcGVyY2VudCBvciBhbW91bnQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FsbG9jYXRlZF9yZW1haW5kZXI6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRlZCB0byB0aGUgdGFyZ2V0IGFjY291bnQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIHRhcmdldCBhY2NvdW50IGlzIG5vdCBhbGxvY2F0ZWQgYSBwZXJjZW50YWdlIG9yIGlmIHRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgbm90IGJlZW4gY29tcGxldGVkIG9yIGlmIGBpc19hbGxvY2F0ZWRfcmVtYWluZGVyYCBpcyB0cnVlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBlcmNlbnRfYWxsb2NhdGVkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkb2xsYXIgYW1vdW50IG9mIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRlZCB0byB0aGUgdGFyZ2V0IGFjY291bnQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIHRhcmdldCBhY2NvdW50IGlzIG5vdCBhbGxvY2F0ZWQgYW4gYW1vdW50IG9yIGlmIHRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgbm90IGJlZW4gY29tcGxldGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciBkaWQgbm90IHNlbGVjdCBhbiBlbXBsb3llciwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3llcl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGVtcGxveWVyIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciBkaWQgbm90IHNlbGVjdCBhbiBlbXBsb3llciwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciBkaWQgbm90IHNlbGVjdCBhbiBpbnN0aXR1dGlvbiwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciBkaWQgbm90IHNlbGVjdCBhbiBpbnN0aXR1dGlvbiwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNyZWF0ZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhdGVfY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUgdGhlIGRlcG9zaXQgc3dpdGNoIHdhcyBjb21wbGV0ZWQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhdGVfY29tcGxldGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3RhdGVFbnVtIHtcbiAgICBJbml0aWFsaXplZCA9ICdpbml0aWFsaXplZCcsXG4gICAgUHJvY2Vzc2luZyA9ICdwcm9jZXNzaW5nJyxcbiAgICBDb21wbGV0ZWQgPSAnY29tcGxldGVkJyxcbiAgICBFcnJvciA9ICdlcnJvcidcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bSB7XG4gICAgSW5zdGFudCA9ICdpbnN0YW50JyxcbiAgICBNYWlsID0gJ21haWwnLFxuICAgIFBkZiA9ICdwZGYnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIkRFUE9TSVRfU1dJVENIXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBcXFwiU1dJVENIX1NUQVRFX1VQREFURVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlLCBvciBzdGF0dXMsIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gIGBpbml0aWFsaXplZGA6IFRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSB1c2VyIGVudGVyaW5nIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBzdWJtaXQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBgcHJvY2Vzc2luZ2A6IFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgYGNvbXBsZXRlZGA6IFRoZSB1c2VyXFwncyBlbXBsb3llciBoYXMgZnVsZmlsbGVkIGFuZCBjb21wbGV0ZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBgZXJyb3JgOiBUaGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtEZXBvc2l0IFN3aXRjaCBBUEkgcmVmZXJlbmNlXSgvZG9jcy9kZXBvc2l0LXN3aXRjaC9yZWZlcmVuY2UjZGVwb3NpdF9zd2l0Y2hnZXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSb3V0aW5nIG51bWJlciBmb3IgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnQsIGFzIGl0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSBlbmQgdXNlciBpbiB0aGUgRGVwb3NpdCBTd2l0Y2ggaW50ZXJmYWNlLiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIG5hbWUgdXNlZCBpbiBvbmxpbmUgYmFua2luZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRBY2NvdW50U3VidHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRBY2NvdW50U3VidHlwZUVudW0ge1xuICAgIENoZWNraW5nID0gJ2NoZWNraW5nJyxcbiAgICBTYXZpbmdzID0gJ3NhdmluZ3MnXG59XG5cbi8qKlxuICogVGhlIGRlcG9zaXQgc3dpdGNoIHRhcmdldCB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBnaXZlbiBuYW1lIChmaXJzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmFtaWx5IG5hbWUgKGxhc3QgbmFtZSkgb2YgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGEgdmFyaWV0eSBvZiBwaG9uZSBudW1iZXIgZm9ybWF0cywgaW5jbHVkaW5nIEUuMTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXhwYXllciBJRCBvZiB0aGUgdXNlciwgZ2VuZXJhbGx5IHRoZWlyIFNTTiwgRUlOLCBvciBUSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICB0YXhfcGF5ZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEZXBvc2l0IHN3aXRjaCB0b2tlbiwgdXNlZCB0byBpbml0aWFsaXplIExpbmsgZm9yIHRoZSBEZXBvc2l0IFN3aXRjaCBwcm9kdWN0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4cGlyYXRpb24gdGltZSBvZiB0aGUgdG9rZW4sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfdG9rZW5fZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtZGVwb3NpdG9yeSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGUge1xuICAgIENoZWNraW5nID0gJ2NoZWNraW5nJyxcbiAgICBTYXZpbmdzID0gJ3NhdmluZ3MnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIENkID0gJ2NkJyxcbiAgICBNb25leU1hcmtldCA9ICdtb25leSBtYXJrZXQnLFxuICAgIFBheXBhbCA9ICdwYXlwYWwnLFxuICAgIFByZXBhaWQgPSAncHJlcGFpZCcsXG4gICAgQ2FzaE1hbmFnZW1lbnQgPSAnY2FzaCBtYW5hZ2VtZW50JyxcbiAgICBFYnQgPSAnZWJ0JyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdG9yeUZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV0YWlsZWRPcmlnaW5hdG9yXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBPcmlnaW5hdG9y4oCZcyBjbGllbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0YWlsZWRPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9kaWxpZ2VuY2Vfc3RhdHVzOiBUcmFuc2ZlckRpbGlnZW5jZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0YWlsZWRPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcG9zc2libGUgYWNjb3VudCBkZXRlY3RlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRlY3RlZEFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERldGVjdGVkQWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBhY2NvdW50IHR5cGUgKGRlcG9zaXRvcnksIGNyZWRpdCwgbG9hbiwgaW52ZXN0bWVudCBldGMuKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbnMgdG8vZnJvbSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnRzIHRoYXQgdGhlIHBheW1lbnQgd2FzIGRpc3RyaWJ1dGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGFjY291bnQgZm9yIHRoZSBnaXZlbiBkaXN0cmlidXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayB0aGF0IHRoZSBwYXltZW50IGlzIGJlaW5nIGRlcG9zaXRlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBiYW5rX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgZGlzdHJpYnV0ZWQgdG8gdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB0aGUgcGF5c3R1YiB3YXMgc2VudCB0byAoZS5nLiBcXCdjaGVja2luZ1xcJykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZG9jdW1lbnQuICBgRE9DVU1FTlRfVFlQRV9QQVlTVFVCYDogQSBwYXlzdHViLiAgYERPQ1VNRU5UX1RZUEVfQkFOS19TVEFURU1FTlRgOiBBIGJhbmsgc3RhdGVtZW50LiAgYERPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyYDogQSBXLTIgd2FnZSBhbmQgdGF4IHN0YXRlbWVudCBwcm92aWRlZCBieSBhIFVTIGVtcGxveWVyIHJlZmxlY3Rpbmcgd2FnZXMgZWFybmVkIGJ5IHRoZSBlbXBsb3llZS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVNgOiBBIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0ZW1lbnQgKExFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0NMRVNgOiBBIENpdmlsaWFuIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0ZW1lbnQgKENMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgRE9DVU1FTlRfVFlQRV9HSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBET0NVTUVOVF9UWVBFX05PTkVgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCBmb3IgdGhlIGRhdGEuICBgRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBVTktOT1dOYDogRG9jdW1lbnQgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY1R5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgRG9jdW1lbnRUeXBlUGF5c3R1YiA9ICdET0NVTUVOVF9UWVBFX1BBWVNUVUInLFxuICAgIERvY3VtZW50VHlwZUJhbmtTdGF0ZW1lbnQgPSAnRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVCcsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXhXMiA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF9XMicsXG4gICAgRG9jdW1lbnRUeXBlVXNNaWxpdGFyeUVyYXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9FUkFTJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5TGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfTEVTJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5Q2xlcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0NMRVMnLFxuICAgIERvY3VtZW50VHlwZUdpZyA9ICdET0NVTUVOVF9UWVBFX0dJRycsXG4gICAgRG9jdW1lbnRUeXBlTm9uZSA9ICdET0NVTUVOVF9UWVBFX05PTkUnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OU1pc2MgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9NSVNDJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheDEwOTlLID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYXzEwOTlfSycsXG4gICAgRG9jdW1lbnRUeXBlUGxhaWRHZW5lcmF0ZWRQYXlzdHViUGRmID0gJ0RPQ1VNRU5UX1RZUEVfUExBSURfR0VORVJBVEVEX1BBWVNUVUJfUERGJ1xufVxuXG4vKipcbiAqIEhpZ2ggbGV2ZWwgZGVzY3JpcHRpb25zIG9mIGhvdyB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudCB3YXMgcHJvY2Vzc2VkLiBJZiBhIGRvY3VtZW50IGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBkb2N1bWVudCB3YXMgcmVqZWN0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhdXRoZW50aWNpdHk6IERvY3VtZW50QXV0aGVudGljaXR5TWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbWFnZVF1YWxpdHl9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpbWFnZV9xdWFsaXR5OiBJbWFnZVF1YWxpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBleHRyYWN0ZWRfZGF0YTogUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpcyB8IG51bGw7XG59XG4vKipcbiAqIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB3aGV0aGVyIHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UgbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBhbmQgc2VjdXJpdHkgY2hlY2tzIGZvciB0aGUgYXNzb2NpYXRlZCBqdXJpc2RpY3Rpb24uICBGb3IgZXhhbXBsZSwgbW9zdCBpZGVudGl0eSBkb2N1bWVudHMgaGF2ZSBmb3JtYXR0aW5nIHJ1bGVzIGxpa2UgdGhlIGZvbGxvd2luZzogICBUaGUgaW1hZ2Ugb2YgdGhlIHBlcnNvblxcJ3MgZmFjZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGNvbnRyYXN0IGluIG9yZGVyIHRvIGhpZ2hsaWdodCBza2luIHRvbmUgICBUaGUgc3ViamVjdCBpbiB0aGUgZG9jdW1lbnRcXCdzIGltYWdlIG11c3QgcmVtb3ZlIGV5ZSBnbGFzc2VzIGFuZCBwb3NlIGluIGEgY2VydGFpbiB3YXkgICBUaGUgaW5mb3JtYXRpb25hbCBmaWVsZHMgKG5hbWUsIGRhdGUgb2YgYmlydGgsIElEIG51bWJlciwgZXRjLikgbXVzdCBiZSBjb2xvcmVkIGFuZCBhbGlnbmVkIGFjY29yZGluZyB0byBzcGVjaWZpYyBydWxlcyAgIFNlY3VyaXR5IGZlYXR1cmVzIGxpa2Ugd2F0ZXJtYXJrcyBhbmQgYmFja2dyb3VuZCBwYXR0ZXJucyBtdXN0IGJlIHByZXNlbnQgIFNvIGEgYG1hdGNoYCBzdGF0dXMgZm9yIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBzZWVtcyB0byBjb25mb3JtIHRvIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgYW5kIHNlY3VyaXR5IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBkYXRlIG9mIGJpcnRoLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgZGF0ZSBvZiBiaXJ0aCB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIHVwbG9hZGVkIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudE1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudE1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBvZiB0aGUgZG9jdW1lbnQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBkb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4gIGBET0NVTUVOVF9FUlJPUmA6IFRoZSBkb2N1bWVudCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLiBQb3NzaWJsZSBjYXVzZXMgaW5jbHVkZTogVGhlIGRvY3VtZW50IHdhcyBhbiB1bmFjY2VwdGFibGUgZG9jdW1lbnQgdHlwZSBzdWNoIGFzIGFuIG9mZmVyIGxldHRlciBvciBiYW5rIHN0YXRlbWVudCwgdGhlIGRvY3VtZW50IGltYWdlIHdhcyBjcm9wcGVkIG9yIGJsdXJyeSwgb3IgdGhlIGRvY3VtZW50IHdhcyBjb3JydXB0ZWQuICBgVU5LTk9XTmAgb3IgYG51bGxgOiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gSWYgdGhpcyBoYXBwZW5zIHJlcGVhdGVkbHksIGNvbnRhY3Qgc3VwcG9ydCBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCB0aGF0IGlzIGFsc28gcHJlc2VudCBpbiB0aGUgcGF5c3R1YiByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG9jX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2NUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG9jX3R5cGU/OiBEb2NUeXBlO1xufVxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBuYW1lLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgbmFtZSB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudE5hbWVNYXRjaENvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGEgY2VydGFpbiByZWFzb24gYXMgdG8gd2h5IGEgZG9jdW1lbnQgY291bGQgcG90ZW50aWFsbHkgYmUgZnJhdWR1bGVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzdWx0IGZyb20gdGhlIHJpc2sgc2lnbmFsIGNoZWNrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIHdoaWNoIHRoZSByaXNrIHNpZ25hbCB3YXMgY29tcHV0ZWQgZm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZmllbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHVzZWQgdG8gcXVpY2tseSBpZGVudGlmeSBpZiB0aGUgc2lnbmFsIGluZGljYXRlcyB0aGF0IHRoaXMgZmllbGQgaXMgYXV0aGVudGljIG9yIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaGFzX2ZyYXVkX3Jpc2s6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9tZXRhZGF0YTogRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBmaWVsZCwgYXMgc2VlbiBvbiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBleHBlY3RlZF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVyaXZlZCB2YWx1ZSBvYnRhaW5lZCBpbiB0aGUgcmlzayBzaWduYWwgY2FsY3VsYXRpb24gcHJvY2VzcyBmb3IgdGhpcyBmaWVsZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGFjdHVhbF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHByb3ZpZGluZyBtb3JlIGRldGFpbCBpbnRvIHRoZSBwYXJ0aWN1bGFyIHJpc2sgc2lnbmFsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgc2lnbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWxldmFudCBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlzayBzaWduYWxcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBwYWdlX251bWJlcjogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGluc3RpdHV0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmVyaWZpY2F0aW9uIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBmb3IgYSBzZXQgb2YgaW5jb21lIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnQgbWV0YWRhdGEgYW5kIGFzc29jaWF0ZWQgcmlzayBzaWduYWxzIHBlciBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxTaW5nbGVEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgc2luZ2xlX2RvY3VtZW50X3Jpc2tfc2lnbmFsczogQXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByaXNrIHNpZ25hbHMgY29tcHV0ZWQgZnJvbSBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHMgYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50c1xcJyBtZXRhZGF0YVxuICAgICAqIEB0eXBlIHtBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBtdWx0aV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogQSBzdW1tYXJ5IGFjcm9zcyBhbGwgcmlzayBzaWduYWxzIGFzc29jaWF0ZWQgd2l0aCBhIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1N1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1N1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCwgaW5jbHVzaXZlLCB3aGVyZSBhIHNjb3JlIGNsb3NlciB0byAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSB0cnVzdHdvcnRoeSBhbmQgYSBzY29yZSBjbG9zZXIgdG8gMTAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfc2NvcmU6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIGRvY3VtZW50IHN1Ym1pc3Npb24uIERpc3RpbmN0IGZyb20gdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbi5zdGF0dXNgIHRoYXQgc3VtbWFyaXplcyB0aGUgdmVyaWZpY2F0aW9uIG91dGNvbWUgZnJvbSBvbmUgb3IgbW9yZSBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJ1xufVxuXG4vKipcbiAqIERhdGEsIGltYWdlcywgYW5hbHlzaXMsIGFuZCByZXN1bHRzIGZyb20gdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5kb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5kb2N1bWVudGFyeV92ZXJpZmljYXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZG9jdW1lbnRzIHN1Ym1pdHRlZCB0byB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gRWFjaCBlbnRyeSByZXByZXNlbnRzIG9uZSB1c2VyIHN1Ym1pc3Npb24sIHdoZXJlIGVhY2ggc3VibWlzc2lvbiB3aWxsIGNvbnRhaW4gYm90aCBhIGZyb250IGFuZCBiYWNrIGltYWdlLCBvciBqdXN0IGEgZnJvbnQgaW1hZ2UsIGRlcGVuZGluZyBvbiB0aGUgZG9jdW1lbnQgdHlwZS4gIE5vdGU6IFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBsZXQgYSB1c2VyIHN1Ym1pdCBhIG5ldyBzZXQgb2YgZG9jdW1lbnQgaW1hZ2VzIHVwIHRvIHRocmVlIHRpbWVzIGlmIHdlIGRldGVjdCB0aGF0IGEgcHJldmlvdXMgYXR0ZW1wdCBtaWdodCBoYXZlIGZhaWxlZCBkdWUgdG8gdXNlciBlcnJvci4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmaXJzdCBzZXQgb2YgZG9jdW1lbnQgaW1hZ2VzIGFyZSBibHVycnkgb3Igb2JzY3VyZWQgYnkgZ2xhcmUsIHRoZSB1c2VyIHdpbGwgYmUgYXNrZWQgdG8gY2FwdHVyZSB0aGVpciBkb2N1bWVudHMgYWdhaW4sIHJlc3VsdGluZyBpbiBhdCBsZWFzdCB0d28gc2VwYXJhdGUgZW50cmllcyB3aXRoaW4gYGRvY3VtZW50c2AuIElmIHRoZSBvdmVyYWxsIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGlzIGBmYWlsZWRgLCB0aGUgdXNlciBoYXMgZXhoYXVzdGVkIHRoZWlyIHJldHJ5IGF0dGVtcHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudHM6IEFycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+O1xufVxuLyoqXG4gKiBJbWFnZXMsIGV4dHJhY3RlZCBkYXRhLCBhbmQgYW5hbHlzaXMgZnJvbSBhIHVzZXJcXCdzIGlkZW50aXR5IGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXR0ZW1wdGAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCBkb2N1bWVudCB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEltYWdlc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGltYWdlczogUGh5c2ljYWxEb2N1bWVudEltYWdlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGF9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBleHRyYWN0ZWRfZGF0YTogUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYW5hbHlzaXM6IERvY3VtZW50QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5c3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bj86IEFycmF5PEVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbD86IEVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVhcm5pbmdzIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc0JyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENvbW1vbmx5IHVzZWQgdGVybSB0byBkZXNjcmliZSB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEJhc2ljQWxsb3dhbmNlSG91c2luZyA9ICdCQVNJQyBBTExPV0FOQ0UgSE9VU0lORycsXG4gICAgQmFzaWNBbGxvd2FuY2VTdWJzaXN0ZW5jZSA9ICdCQVNJQyBBTExPV0FOQ0UgU1VCU0lTVEVOQ0UnLFxuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzVG90YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHl0ZF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGhvdXJzIHdvcmtlZCBmb3IgdGhpcyBwYXkgcGVyaW9kXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW1haWwgYWRkcmVzc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbWFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgZW1haWwgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBlbWFpbCBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1haWwgYWNjb3VudCBhcyBkZXNjcmliZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHR5cGU6IEVtYWlsVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRW1haWxUeXBlRW51bSB7XG4gICAgUHJpbWFyeSA9ICdwcmltYXJ5JyxcbiAgICBTZWNvbmRhcnkgPSAnc2Vjb25kYXJ5JyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBlbWFpbCBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIGVtYWlsIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2ggYW5kIDAgaXMgYSBubyBtYXRjaC4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBlbWFpbC4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBlbWFpbCB3aXRoIGRpZmZlcmVudCBcXCcrXFwnIGV4dGVuc2lvbnMpLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgZW1haWwgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzczogUGF5c3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYHNpbmdsZWAgb3IgYG1hcnJpZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkPzogVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBBZGRyZXNzRGF0YU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBmcm9tIDAgdG8gMSBpbmRpY2F0aW5nIFBsYWlkXFwncyBsZXZlbCBvZiBjb25maWRlbmNlIGluIHRoZSBwYWlyaW5nIGJldHdlZW4gdGhlIGVtcGxveWVyIGFuZCB0aGUgaW5zdGl0dXRpb24gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgY29uZmlkZW5jZV9zY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJWZXJpZmljYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEVtcGxveWVyc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgbmFtZSB0byBiZSBzZWFyY2hlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIHByb2R1Y3RzIHRoZSByZXR1cm5lZCBlbXBsb3llcnMgc2hvdWxkIHN1cHBvcnQuIEN1cnJlbnRseSwgdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBgXFxcImRlcG9zaXRfc3dpdGNoXFxcImAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95ZXJzIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWEuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3llcnM6IEFycmF5PEVtcGxveWVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZW1wbG95bWVudCBkZXRhaWxzIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnREZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFubnVhbF9zYWxhcnk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvbiB3aGljaCB0aGUgZW1wbG95ZWUgd2FzIGhpcmVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBoaXJlX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZXMgb2Ygc291cmNlIGVtcGxveW1lbnQgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbXBsb3ltZW50U291cmNlVHlwZSB7XG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1cz86IEVtcGxveW1lbnRWZXJpZmljYXRpb25TdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IG9mIGVtcGxveW1lbnQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyPzogRW1wbG95ZXJWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0aXRsZSBvZiBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkcz86IFBsYXRmb3JtSWRzO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIHN1bW1hcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRzOiBBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgRW1wbG95bWVudFN0YXR1c0FjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19BQ1RJVkUnLFxuICAgIEVtcGxveW1lbnRTdGF0dXNJbmFjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19JTkFDVElWRScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVuaGFuY2VtZW50IGZpZWxkcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlbWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxDb3VudGVycGFydHk+O1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYWNjb3VudCBob2xkZXI6ICBgT1VURkxPV2AgLSBJbmNsdWRlcyBvdXRnb2luZyB0cmFuc2ZlcnMsIHB1cmNoYXNlcywgYW5kIGZlZXMuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgcG9zaXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLikgIGBJTkZMT1dgIC0gSW5jbHVkZXMgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzLCBhbmQgaW5jb21lLiAoVHlwaWNhbGx5IHJlcHJlc2VudGVkIGFzIGEgcG9zaXRpdmUgdmFsdWUgb24gY2hlY2tpbmcgYWNjb3VudHMgYW5kIGRlYml0IGNhcmRzIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNyZWRpdCBjYXJkcy4pXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbiB7XG4gICAgSW5mbG93ID0gJ0lORkxPVycsXG4gICAgT3V0ZmxvdyA9ICdPVVRGTE9XJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVucmljaG1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnJpY2htZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW5yaWNobWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllczogQXJyYXk8Q291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBsZWdhY3kgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxlZ2FjeV9jYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGxlZ2FjeSBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgZm9yIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHRvIG9idGFpbiB0aGUgYmVzdCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENoYW5uZWx9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeV9jb3VudGVycGFydHkgaW4gRS4gMTY0IGZvcm1hdC4gSWYgdGhlcmUgaXMgYSBsb2NhdGlvbiBtYXRjaCAoaS5lLiBhIHN0cmVldCBhZGRyZXNzIGlzIHJldHVybmVkIGluIHRoZSBsb2NhdGlvbiBvYmplY3QpLCB0aGUgcGhvbmUgbnVtYmVyIHdpbGwgYmUgbG9jYXRpb24gc3BlY2lmaWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk6IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHJlY3VycmVuY2U/OiBSZWN1cnJlbmNlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9mZmljaWFsIGRvY3VtZW50LCB1c3VhbGx5IGlzc3VlZCBieSBhIGdvdmVybmluZyBib2R5IG9yIGluc3RpdHV0aW9uLCB3aXRoIGFuIGFzc29jaWF0ZWQgaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eURvY3VtZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eURvY3VtZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICB0eXBlOiBFbnRpdHlEb2N1bWVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlrYCAtIFJ1c3NpYW4gYmFuayBjb2RlICBgYnVzaW5lc3NfbnVtYmVyYCAtIEEgbnVtYmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgYnVzaW5lc3Mgd2l0aGluIGEgY2F0ZWdvcnkgb2YgYnVzaW5lc3NlcyAgYGltb2AgLSBOdW1iZXIgYXNzaWduZWQgdG8gdGhlIGVudGl0eSBieSB0aGUgSW50ZXJuYXRpb25hbCBNYXJpdGltZSBPcmdhbml6YXRpb24gIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHN3aWZ0YCAtIE51bWJlciBpZGVudGlmeWluZyBhIGJhbmsgYW5kIGJyYW5jaC4gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlEb2N1bWVudFR5cGUge1xuICAgIEJpayA9ICdiaWsnLFxuICAgIEJ1c2luZXNzTnVtYmVyID0gJ2J1c2luZXNzX251bWJlcicsXG4gICAgSW1vID0gJ2ltbycsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFN3aWZ0ID0gJ3N3aWZ0JyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnXG59XG5cbi8qKlxuICogQW5hbHlzaXMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aHkgYSBzY3JlZW5pbmcgaGl0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIGVudGl0eSBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVycz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgdXJscz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIGVudGl0eSBzY3JlZW5pbmcgaGl0cyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhleSBoYXZlIGJlZW4gcmV2aWV3ZWQuIElmIGNoYW5nZXMgYXJlIGRldGVjdGVkIGR1ZSB0byB1cGRhdGVzIHRvIHRoZSBlbnRpdHkgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zX3ZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICB1cmxzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnRzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eURvY3VtZW50O1xufVxuLyoqXG4gKiBFbWFpbCBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5emVkIGVtYWlscyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdEVtYWlsc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzO1xufVxuLyoqXG4gKiBOYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBuYW1lcyBhcmUgdGhvc2UgbW9zdCBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgZW50aXR5LiBPbmx5IG9uZSBuYW1lIHdpbGwgZXZlciBiZSBtYXJrZWQgYXMgcHJpbWFyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICBpc19wcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWFrQWxpYXNEZXRlcm1pbmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIHdlYWtfYWxpYXNfZGV0ZXJtaW5hdGlvbjogV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgbmFtZXMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXROYW1lc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lcztcbn1cbi8qKlxuICogUGhvbmUgbnVtYmVyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5IHNjcmVlbmluZyBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAgICAgKi9cbiAgICB0eXBlOiBQaG9uZVR5cGU7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBVUkxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5IHNjcmVlbmluZyBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5emVkIFVSTHMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRVcmxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0VXJscztcbn1cbi8qKlxuICogQW5hbHl6ZWQgcGhvbmUgbnVtYmVycyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVudGl0eSBzY3JlZW5pbmcgc3RhdHVzIGhhcyBjaGFuZ2VkLCB3aGljaCBjYW4gb2NjdXIgbWFudWFsbHkgdmlhIHRoZSBkYXNoYm9hcmQgb3IgZHVyaW5nIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEVOVElUWV9TQ1JFRU5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTaG9ydGhhbmQgaWRlbnRpZmllciBmb3IgYSBzcGVjaWZpYyBzY3JlZW5pbmcgbGlzdCBmb3IgZW50aXRpZXMuICBgQVVfQ09OYDogQXVzdHJhbGlhIERlcGFydG1lbnQgb2YgRm9yZWlnbiBBZmZhaXJzIGFuZCBUcmFkZSBDb25zb2xpZGF0ZWQgTGlzdCAgYENBX0NPTmA6IEdvdmVybm1lbnQgb2YgQ2FuYWRhIENvbnNvbGlkYXRlZCBMaXN0IG9mIFNhbmN0aW9ucyAgYEVVX0NPTmA6IEV1cm9wZWFuIEV4dGVybmFsIEFjdGlvbiBTZXJ2aWNlIENvbnNvbGlkYXRlZCBMaXN0ICBgSVpfU09FYDogU3RhdGUgT3duZWQgRW50ZXJwcmlzZSBMaXN0ICBgSVpfVU5DYDogVW5pdGVkIE5hdGlvbnMgQ29uc29saWRhdGVkIFNhbmN0aW9ucyAgYElaX1dCS2A6IFdvcmxkIEJhbmsgTGlzdGluZyBvZiBJbmVsaWdpYmxlIEZpcm1zIGFuZCBJbmRpdmlkdWFscyAgYFVTX0NBUGA6IFVTIE9GQUMgQ29ycmVzcG9uZGVudCBBY2NvdW50IG9yIFBheWFibGUtVGhyb3VnaCBBY2NvdW50IFNhbmN0aW9ucyAgYFVTX0ZTRWA6IFVTIE9GQUMgRm9yZWlnbiBTYW5jdGlvbnMgRXZhZGVycyAgYFVTX01CU2A6IFVTIE5vbi1TRE4gTWVudS1CYXNlZCBTYW5jdGlvbnMgIGBVU19TRE5gOiBVUyBTcGVjaWFsbHkgRGVzaWduYXRlZCBOYXRpb25hbHMgTGlzdCAgYFVTX1NTSWA6IFVTIE9GQUMgU2VjdG9yYWwgU2FuY3Rpb25zIElkZW50aWZpY2F0aW9ucyAgYFVTX0NNQ2A6IFVTIE9GQUMgTm9uLVNETiBDaGluZXNlIE1pbGl0YXJ5LUluZHVzdHJpYWwgQ29tcGxleCBMaXN0ICBgVVNfVVZMYDogQnVyZWF1IG9mIEluZHVzdHJ5IGFuZCBTZWN1cml0eSBVbnZlcmlmaWVkIExpc3QgIGBVS19ITUNgOiBVSyBITSBUcmVhc3VyeSBDb25zb2xpZGF0ZWQgTGlzdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW50aXR5V2F0Y2hsaXN0Q29kZSB7XG4gICAgQ2FDb24gPSAnQ0FfQ09OJyxcbiAgICBFdUNvbiA9ICdFVV9DT04nLFxuICAgIEl6U29lID0gJ0laX1NPRScsXG4gICAgSXpVbmMgPSAnSVpfVU5DJyxcbiAgICBJeldiayA9ICdJWl9XQksnLFxuICAgIFVzQ2FwID0gJ1VTX0NBUCcsXG4gICAgVXNGc2UgPSAnVVNfRlNFJyxcbiAgICBVc01icyA9ICdVU19NQlMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBVc0NtYyA9ICdVU19DTUMnLFxuICAgIFVzVXZsID0gJ1VTX1VWTCcsXG4gICAgQXVDb24gPSAnQVVfQ09OJyxcbiAgICBVa0htYyA9ICdVS19ITUMnXG59XG5cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBlbnRpdGllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxFbnRpdHlXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxFbnRpdHlXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBlbnRpdHkgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIE9yZ2FuaXphdGlvbnNcXFwiIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBEYXRhIGZyb20gYSBnb3Zlcm5tZW50IHdhdGNobGlzdCB0aGF0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBzY3JlZW5pbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZyBoaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICByZXZpZXdfc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGZpcnN0X2FjdGl2ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpbmFjdGl2ZV9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgbGlzdF9jb2RlOiBFbnRpdHlXYXRjaGxpc3RDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pdmVyc2FsIGlkZW50aWZpZXIgZm9yIGEgd2F0Y2hsaXN0IGluZGl2aWR1YWwgdGhhdCBpcyBzdGFibGUgYWNyb3NzIHNlYXJjaGVzIGFuZCB1cGRhdGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHBsYWlkX3VpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2Ugc2FuY3Rpb24gb3Igd2F0Y2hsaXN0LiBXaGVuIG9uZSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgc291cmNlX3VpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdERhdGF9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXREYXRhO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVudGl0eSB1c2VkIGZvciBzZWFyY2hpbmcgYWdhaW5zdCB3YXRjaGxpc3RzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBTZWFyY2ggaW5wdXRzIGZvciBjcmVhdGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBleHBpcmVkIHdoZW4gdGhlIHZlcmlmaWNhdGlvbiB3YXMgcGVyZm9ybWVkLiAgTm90ZTogSW4gdGhlIGNhc2Ugd2hlcmUgYW4gZXhwaXJhdGlvbiBkYXRlIGlzIG5vdCBwcmVzZW50IG9uIHRoZSBkb2N1bWVudCBvciBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vX2RhdGFgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRXhwaXJhdGlvbkRhdGUge1xuICAgIE5vdEV4cGlyZWQgPSAnbm90X2V4cGlyZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIFBsYWlkIHdpbGwgYXR0ZW1wdCB0byByZXF1ZXN0IHJlZnVuZCBkZXRhaWxzIGZyb20gdGhlIHBheWVlXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBTdXBwb3J0IHZhcmllcyBiZXR3ZWVuIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIHdpbGwgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuICBJZiByZWZ1bmQgZGV0YWlscyBjb3VsZCBiZSByZXRyaWV2ZWQsIHRoZXkgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNldCB1cCBwYXltZW50IGNvbnNlbnQgdXNpbmcgb25seSB0aGUgc3BlY2lmaWVkIGJhbmsgYWNjb3VudCBpZiBwcm92aWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gICAgICovXG4gICAgYmFjcz86IFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3MgfCBudWxsO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIHBheW1lbnQgb3B0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGV4dGVybmFsIHBheW1lbnQgcmVmdW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGhvbGRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gICAgICovXG4gICAgYmFjczogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGludGVydmFsPzogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIG9ubHkgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFR5cGVzIG9mIGRvY3VtZW50IGZvcm1hdHMuIChTdWdnZXN0ZWQgdmFsdWVzKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYQ29udGVudFR5cGVzIHtcbiAgICBBcHBsaWNhdGlvblBkZiA9ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgIEltYWdlR2lmID0gJ2ltYWdlL2dpZicsXG4gICAgSW1hZ2VKcGVnID0gJ2ltYWdlL2pwZWcnLFxuICAgIEltYWdlVGlmZiA9ICdpbWFnZS90aWZmJyxcbiAgICBJbWFnZVBuZyA9ICdpbWFnZS9wbmcnLFxuICAgIEFwcGxpY2F0aW9uSnNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJ1xufVxuXG4vKipcbiAqIEZpbmFuY2lhbCBJbnN0aXR1dGlvbiBwcm92aWRlci1zcGVjaWZpYyBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYRmlBdHRyaWJ1dGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZEWEZpQXR0cmlidXRlIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGF0dHJpYnV0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbn1cbi8qKlxuICogUkVTVCBhcHBsaWNhdGlvbiBjb25zdHJhaW50IChIeXBlcm1lZGlhIEFzIFRoZSBFbmdpbmUgT2YgQXBwbGljYXRpb24gU3RhdGUpXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGRFhIYXRlb2FzTGluayB7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIGludm9rZSB0aGUgYWN0aW9uIG9uIHRoZSByZXNvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgaHJlZjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhIYXRlb2FzTGlua0FjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICBhY3Rpb24/OiBGRFhIYXRlb2FzTGlua0FjdGlvbjtcbiAgICAvKipcbiAgICAgKiBSZWxhdGlvbiBvZiB0aGlzIGxpbmsgdG8gaXRzIGNvbnRhaW5pbmcgZW50aXR5LCBhcyBkZWZpbmVkIGJ5IGFuZCB3aXRoIG1hbnkgZXhhbXBsZSByZWxhdGlvbiB2YWx1ZXMgYXQgW0lFVEYgUkZDNTk4OF0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM1OTg4KVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgcmVsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENvbnRlbnQtdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAqIEB0eXBlIHtBcnJheTxGRFhDb250ZW50VHlwZXM+fVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIHR5cGVzPzogQXJyYXk8RkRYQ29udGVudFR5cGVzPjtcbn1cbi8qKlxuICogSFRUUCBNZXRob2QgdG8gdXNlIGZvciB0aGUgcmVxdWVzdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYSGF0ZW9hc0xpbmtBY3Rpb24ge1xuICAgIEdldCA9ICdHRVQnLFxuICAgIFBvc3QgPSAnUE9TVCcsXG4gICAgUGF0Y2ggPSAnUEFUQ0gnLFxuICAgIERlbGV0ZSA9ICdERUxFVEUnLFxuICAgIFB1dCA9ICdQVVQnXG59XG5cbi8qKlxuICogSW5pdGlhdG9yIEZpIEF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlPzogRkRYUGFydHlUeXBlO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgYmFzZSBmaWVsZHMgb2YgYSBub3RpZmljYXRpb24uIENsaWVudHMgd2lsbCByZWFkIHRoZSBgdHlwZWAgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBub3RpZmljYXRpb24gcGF5bG9hZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSWQgb2Ygbm90aWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgbm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgdHlwZTogRkRYTm90aWZpY2F0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBJU08gODYwMSBkYXRlLXRpbWUgaW4gZm9ybWF0IFxcJ1lZWVktTU0tRERUaGg6bW06c3Mubm5uW1p8Wyt8LV1oaDptbV1cXCcgYWNjb3JkaW5nIHRvIFtJRVRGIFJGQzMzMzldKGh0dHBzOi8veG1sMnJmYy50b29scy5pZXRmLm9yZy9wdWJsaWMvcmZjL2h0bWwvcmZjMzMzOS5odG1sI2FuY2hvcjE0KVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHNlbnRPbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25DYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25TZXZlcml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc2V2ZXJpdHk/OiBGRFhOb3RpZmljYXRpb25TZXZlcml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUHJpb3JpdHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHByaW9yaXR5PzogRkRYTm90aWZpY2F0aW9uUHJpb3JpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaXNoZXI/OiBGRFhQYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHN1YnNjcmliZXI/OiBGRFhQYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZH1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgbm90aWZpY2F0aW9uUGF5bG9hZDogRkRYTm90aWZpY2F0aW9uUGF5bG9hZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYSGF0ZW9hc0xpbmt9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHVybD86IEZEWEhhdGVvYXNMaW5rO1xufVxuLyoqXG4gKiBDYXRlZ29yeSBvZiBOb3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5IHtcbiAgICBTZWN1cml0eSA9ICdTRUNVUklUWScsXG4gICAgTWFpbnRlbmFuY2UgPSAnTUFJTlRFTkFOQ0UnLFxuICAgIEZyYXVkID0gJ0ZSQVVEJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnLFxuICAgIE5ld0RhdGEgPSAnTkVXX0RBVEEnXG59XG5cbi8qKlxuICogQ3VzdG9tIGtleS12YWx1ZSBwYWlycyBwYXlsb2FkIGZvciBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25QYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBJRCBmb3IgdGhlIG9yaWdpbmF0aW9uIGVudGl0eSByZWxhdGVkIHRvIHRoZSBub3RpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25QYXlsb2FkXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZFR5cGU/OiBGRFhOb3RpZmljYXRpb25QYXlsb2FkSWRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxGRFhGaUF0dHJpYnV0ZT59XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBjdXN0b21GaWVsZHM/OiBBcnJheTxGRFhGaUF0dHJpYnV0ZT47XG59XG4vKipcbiAqIFR5cGUgb2YgZW50aXR5IGNhdXNpbmcgb3JpZ2luYXRpb24gb2YgYSBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGUge1xuICAgIEFjY291bnQgPSAnQUNDT1VOVCcsXG4gICAgQ3VzdG9tZXIgPSAnQ1VTVE9NRVInLFxuICAgIFBhcnR5ID0gJ1BBUlRZJyxcbiAgICBNYWludGVuYW5jZSA9ICdNQUlOVEVOQU5DRScsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJ1xufVxuXG4vKipcbiAqIFByaW9yaXR5IG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUHJpb3JpdHkge1xuICAgIEhpZ2ggPSAnSElHSCcsXG4gICAgTWVkaXVtID0gJ01FRElVTScsXG4gICAgTG93ID0gJ0xPVydcbn1cblxuLyoqXG4gKiBTZXZlcml0eSBsZXZlbCBvZiBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblNldmVyaXR5IHtcbiAgICBFbWVyZ2VuY3kgPSAnRU1FUkdFTkNZJyxcbiAgICBBbGVydCA9ICdBTEVSVCcsXG4gICAgV2FybmluZyA9ICdXQVJOSU5HJyxcbiAgICBOb3RpY2UgPSAnTk9USUNFJyxcbiAgICBJbmZvID0gJ0lORk8nXG59XG5cbi8qKlxuICogVHlwZSBvZiBOb3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWE5vdGlmaWNhdGlvblR5cGUge1xuICAgIENvbnNlbnRSZXZva2VkID0gJ0NPTlNFTlRfUkVWT0tFRCcsXG4gICAgQ29uc2VudFVwZGF0ZWQgPSAnQ09OU0VOVF9VUERBVEVEJyxcbiAgICBDdXN0b20gPSAnQ1VTVE9NJyxcbiAgICBTZXJ2aWNlID0gJ1NFUlZJQ0UnLFxuICAgIEJhbGFuY2UgPSAnQkFMQU5DRScsXG4gICAgUGxhbm5lZE91dGFnZSA9ICdQTEFOTkVEX09VVEFHRSdcbn1cblxuLyoqXG4gKiBGRFggUGFydGljaXBhbnQgLSBhbiBlbnRpdHkgb3IgcGVyc29uIHRoYXQgaXMgYSBwYXJ0IG9mIGEgRkRYIEFQSSB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhQYXJ0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRkRYUGFydHkge1xuICAgIC8qKlxuICAgICAqIEh1bWFuIHJlY29nbml6YWJsZSBjb21tb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgdHlwZTogRkRYUGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgcGFydHksIHdoZXJlIGFuIGVuZCB1c2VyIGNvdWxkIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGNvbXBhbnkgb3IgYXBwbGljYXRpb24gaW52b2x2ZWQgaW4gdGhlIGRhdGEgc2hhcmluZyBjaGFpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgaG9tZVVyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkkgZm9yIGEgbG9nbyBhc3NldCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBsb2dvVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVJlZ2lzdHJ5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdHJ5PzogRkRYUGFydHlSZWdpc3RyeTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcmVkIG5hbWUgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlOYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgaWQgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlJZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgdGhlIHBhcnR54oCZcyByZWdpc3RyYXRpb24gd2l0aCBuYW1lIGFuZCBpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYUGFydHlSZWdpc3RyeSB7XG4gICAgRmR4ID0gJ0ZEWCcsXG4gICAgR2xlaWYgPSAnR0xFSUYnLFxuICAgIEljYW5uID0gJ0lDQU5OJyxcbiAgICBQcml2YXRlID0gJ1BSSVZBVEUnXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBhIHBhcnR5XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVR5cGUge1xuICAgIERhdGFBY2Nlc3NQbGF0Zm9ybSA9ICdEQVRBX0FDQ0VTU19QTEFURk9STScsXG4gICAgRGF0YVByb3ZpZGVyID0gJ0RBVEFfUFJPVklERVInLFxuICAgIERhdGFSZWNpcGllbnQgPSAnREFUQV9SRUNJUElFTlQnLFxuICAgIEluZGl2aWR1YWwgPSAnSU5ESVZJRFVBTCcsXG4gICAgTWVyY2hhbnQgPSAnTUVSQ0hBTlQnLFxuICAgIFZlbmRvciA9ICdWRU5ET1InXG59XG5cbi8qKlxuICogRmlyZXMgd2hlbiBhbiBhY2NvdW50IGlzIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgdXNpbmcgbWljcm8tZGVwb3NpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQVVUT01BVElDQUxMWV9WRVJJRklFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaWNyby1kZXBvc2l0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZXMgd2hlbiBhbiBhY2NvdW50IGhhcyBhbiBleHBpcmVkIHZlcmlmaWNhdGlvbiB3aGVuIHVzaW5nIG1pY3JvLWRlcG9zaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9FWFBJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWljcm8tZGVwb3NpdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluc2lnaHRzIHN1cnJvdW5kaW5nIGV4dGVybmFsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydGllcyBhc3NvY2lhdGVkIHdpdGggYSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIGlkIHRoYXQgbWFwcyB0byB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc29jaWF0ZWQgYWNjb3VudHMsIGRldGVjdGVkIGJhc2VkIG9uIHRoZSBuYXR1cmUgb2YgdHJhbnNmZXJzIHRvL2Zyb20gdGhpcyBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RGV0ZWN0ZWRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGRldGVjdGVkX2FjY291bnRzOiBBcnJheTxEZXRlY3RlZEFjY291bnQ+O1xufVxuLyoqXG4gKiBGb3JtIDEwOTkgVHlwZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRm9ybTEwOTlUeXBlIHtcbiAgICBVbmtub3duID0gJ0ZPUk1fMTA5OV9UWVBFX1VOS05PV04nLFxuICAgIE1pc2MgPSAnRk9STV8xMDk5X1RZUEVfTUlTQycsXG4gICAgSyA9ICdGT1JNXzEwOTlfVFlQRV9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIHRoZSBmcmF1ZCBvciBhdHRlbXB0ZWQgZnJhdWQuIGBmcmF1ZF9hbW91bnRgIHNob3VsZCBiZSBvbWl0dGVkIHRvIGluZGljYXRlIGFuIHVua25vd24gZnJhdWQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGcmF1ZEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRnJhdWRBbW91bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SVNPQ3VycmVuY3lDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFtb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBJU09DdXJyZW5jeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB2YWx1ZS4gVGhpcyB2YWx1ZSBjYW4gYmUgMCB0byBpbmRpY2F0ZSBubyBtb25leSB3YXMgbG9zdC4gTXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gKGUuZy4sIGAxLjIzYCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBBbmFseXplZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBoZWFsdGggaW5jaWRlbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSGVhbHRoSW5jaWRlbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIGluY2lkZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBpbmNpZGVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIG9uIHRoZSBoZWFsdGggaW5jaWRlbnQuXG4gICAgICogQHR5cGUge0FycmF5PEluY2lkZW50VXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBpbmNpZGVudF91cGRhdGVzOiBBcnJheTxJbmNpZGVudFVwZGF0ZT47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbEJhbGFuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldywgdW5mZXRjaGVkIHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGhvbGRpbmdzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhbiBpbnZlc3RtZW50IGFjY291bnQuIFRoZSB3ZWJob29rIHR5cGljYWxseSBmaXJlcyBpbiByZXNwb25zZSB0byBhbnkgbmV3bHkgYWRkZWQgaG9sZGluZ3Mgb3IgcHJpY2UgY2hhbmdlcyB0byBleGlzdGluZyBob2xkaW5ncywgbW9zdCBjb21tb25seSBhZnRlciBtYXJrZXQgY2xvc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSE9MRElOR1NgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1cGRhdGVkIGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXBkYXRlZF9ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBob2xkaW5ncyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC4gTXVzdCBiZSBmb3JtYXR0ZWQgYXMgYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2Ugb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGhvbGRpbmcuIE11bHRpcGxlIGNvc3QgYmFzaXMgdmFsdWVzIGZvciB0aGUgc2FtZSBzZWN1cml0eSBwdXJjaGFzZWQgYXQgZGlmZmVyZW50IHByaWNlcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY29zdF9iYXNpcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk6IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEhvdyBQbGFpZCBzaG91bGQgZGVsaXZlciB0aGUgUGxhaWQgTGluayBzZXNzaW9uIHRvIHRoZSBjdXN0b21lci4gXFwnc21zXFwnIHdpbGwgZGVsaXZlciB2aWEgU01TLiBNdXN0IHBhc3MgYHVzZXIucGhvbmVfbnVtYmVyYC4gXFwnZW1haWxcXCcgd2lsbCBkZWxpdmVyIHZpYSBlbWFpbC4gTXVzdCBwYXNzIGB1c2VyLmVtYWlsX2FkZHJlc3NgLiBJbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGlnbm9yZWQ7IHVzZSB0aGUgUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0byB0ZXN0IEhvc3RlZCBMaW5rIHNlc3Npb24gZGVsaXZlcnkgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2Qge1xuICAgIFNtcyA9ICdzbXMnLFxuICAgIEVtYWlsID0gJ2VtYWlsJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGhvc3RlZCBzYW1lLWRheSBtaWNyb2RlcG9zaXRzIHZlcmlmaWNhdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBIT1NURURfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmluYWwgc3RhdHVzIG9mIHRoZSBzYW1lLWRheSBtaWNyb2RlcG9zaXRzIHZlcmlmaWNhdGlvbi4gV2lsbCBhbHdheXMgYmUgXFxcIk1BTlVBTExZX1ZFUklGSUVEXFxcIiBvciBcXFwiVkVSSUZJQ0FUSU9OX0ZBSUxFRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIG9mIHRoZSBhZmZlY3RlZCBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgZ2xvYmFsbHkgdW5pcXVlIGFuZCBodW1hbiByZWFkYWJsZSBJRCB0eXBlLCBzcGVjaWZpYyB0byB0aGUgY291bnRyeSBhbmQgZG9jdW1lbnQgY2F0ZWdvcnkuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtIeWJyaWQgSW5wdXQgVmFsaWRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSUROdW1iZXJUeXBlIHtcbiAgICBBckRuaSA9ICdhcl9kbmknLFxuICAgIEF1RHJpdmVyc0xpY2Vuc2UgPSAnYXVfZHJpdmVyc19saWNlbnNlJyxcbiAgICBBdVBhc3Nwb3J0ID0gJ2F1X3Bhc3Nwb3J0JyxcbiAgICBCckNwZiA9ICdicl9jcGYnLFxuICAgIENhU2luID0gJ2NhX3NpbicsXG4gICAgQ2xSdW4gPSAnY2xfcnVuJyxcbiAgICBDblJlc2lkZW50Q2FyZCA9ICdjbl9yZXNpZGVudF9jYXJkJyxcbiAgICBDb05pdCA9ICdjb19uaXQnLFxuICAgIERrQ3ByID0gJ2RrX2NwcicsXG4gICAgRWdOYXRpb25hbElkID0gJ2VnX25hdGlvbmFsX2lkJyxcbiAgICBFc0RuaSA9ICdlc19kbmknLFxuICAgIEVzTmllID0gJ2VzX25pZScsXG4gICAgSGtIa2lkID0gJ2hrX2hraWQnLFxuICAgIEluUGFuID0gJ2luX3BhbicsXG4gICAgSXRDZiA9ICdpdF9jZicsXG4gICAgSm9DaXZpbElkID0gJ2pvX2NpdmlsX2lkJyxcbiAgICBKcE15TnVtYmVyID0gJ2pwX215X251bWJlcicsXG4gICAgS2VIdWR1bWFOYW1iYSA9ICdrZV9odWR1bWFfbmFtYmEnLFxuICAgIEt3Q2l2aWxJZCA9ICdrd19jaXZpbF9pZCcsXG4gICAgTXhDdXJwID0gJ214X2N1cnAnLFxuICAgIE14UmZjID0gJ214X3JmYycsXG4gICAgTXlOcmljID0gJ215X25yaWMnLFxuICAgIE5nTmluID0gJ25nX25pbicsXG4gICAgTnpEcml2ZXJzTGljZW5zZSA9ICduel9kcml2ZXJzX2xpY2Vuc2UnLFxuICAgIE9tQ2l2aWxJZCA9ICdvbV9jaXZpbF9pZCcsXG4gICAgUGhQc24gPSAncGhfcHNuJyxcbiAgICBQbFBlc2VsID0gJ3BsX3Blc2VsJyxcbiAgICBSb0NucCA9ICdyb19jbnAnLFxuICAgIFNhTmF0aW9uYWxJZCA9ICdzYV9uYXRpb25hbF9pZCcsXG4gICAgU2VQaW4gPSAnc2VfcGluJyxcbiAgICBTZ05yaWMgPSAnc2dfbnJpYycsXG4gICAgVHJUY0tpbWxpayA9ICd0cl90Y19raW1saWsnLFxuICAgIFVzU3NuID0gJ3VzX3NzbicsXG4gICAgVXNTc25MYXN0NCA9ICd1c19zc25fbGFzdF80JyxcbiAgICBaYVNtYXJ0SWQgPSAnemFfc21hcnRfaWQnXG59XG5cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElTT0N1cnJlbmN5Q29kZSB7XG4gICAgVXNkID0gJ1VTRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIGlkZW50aXR5IGRhdGEgaGFzIGJlZW4gZGV0ZWN0ZWQgb24gYW4gSXRlbS4gSXRlbXMgYXJlIGNoZWNrZWQgZm9yIGlkZW50aXR5IHVwZGF0ZXMgZXZlcnkgMzAtOTAgZGF5cy4gV2UgcmVjb21tZW5kIHRoYXQgdXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rIHlvdSBtYWtlIGFub3RoZXIgY2FsbCB0byBgL2lkZW50aXR5L2dldGAgdG8gZmV0Y2ggdGhlIHVzZXJcXCdzIGxhdGVzdCBpZGVudGl0eSBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpZGVudGl0eSBhdHRyaWJ1dGVzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJQSE9ORVNcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9pZGVudGl0eTogeyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRG9jdW1lbnQgb2JqZWN0IHdpdGggbWV0YWRhdGEgb2YgdGhlIGRvY3VtZW50IHVwbG9hZGVkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdXBsb2FkZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHk+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlNYXRjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5TWF0Y2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBtYXRjaCBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZSwgcGhvbmUgbnVtYmVyLCBlbWFpbCBhZGRyZXNzIGFuZCBhZGRyZXNzIHVzZWQgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaC4gSWYgRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgaXMgZW5hYmxlZCBpbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QsIGxlYXZlIHRoaXMgZmllbGQgZW1wdHkgdG8gYXV0b21hdGljYWxseSBtYXRjaCBhZ2FpbnN0IFBJSSBjb2xsZWN0ZWQgZnJvbSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGNoZWNrcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGlkZW50aXR5IGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlVcGRhdGVUeXBlcyB7XG4gICAgUGhvbmVzID0gJ1BIT05FUycsXG4gICAgQWRkcmVzc2VzID0gJ0FERFJFU1NFUycsXG4gICAgRW1haWxzID0gJ0VNQUlMUycsXG4gICAgTmFtZXMgPSAnTkFNRVMnXG59XG5cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIFxcJy9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlXFwnXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZXhwb3NlIGEgc2hhcmVhYmxlIFVSTCBmb3IgdGhlIHZlcmlmaWNhdGlvbiBiZWluZyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19zaGFyZWFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkIHRvIGEgcHJpdmFjeSBwb2xpY3kgc3BlY2lmeWluZyB0aGF0IHRoZWlyIGRhdGEgd2lsbCBiZSBzaGFyZWQgd2l0aCBQbGFpZCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzLiAgSWYgYGdhdmVfY29uc2VudGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIGBhY2NlcHRfdG9zYCBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBza2lwcGVkYCBhbmQgdGhlIGVuZCB1c2VyXFwncyBzZXNzaW9uIHdpbGwgc3RhcnQgYXQgdGhlIG5leHQgc3RlcCByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZ2F2ZV9jb25zZW50OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBmbGFnIHNwZWNpZnlpbmcgaG93IHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGhhbmRsZSBhdHRlbXB0cyB0byBjcmVhdGUgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdoZW4gYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgcHJvdmlkZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgaWRlbXBvdGVuY3kgaXMgZW5hYmxlZCwgUGxhaWQgd2lsbCByZXR1cm4gdGhlIGV4aXN0aW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbi4gSWYgaWRlbXBvdGVuY3kgaXMgZGlzYWJsZWQsIFBsYWlkIHdpbGwgcmVqZWN0IHRoZSByZXF1ZXN0IHdpdGggYSBgNDAwIEJhZCBSZXF1ZXN0YCBzdGF0dXMgY29kZSBpZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBzdXBwbGllZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19pZGVtcG90ZW50PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuIElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBzaGFyZWFibGUgVVJMIGZlYXR1cmUsIHlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIHRoZXNlIGZpZWxkcyB2aWEgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW5zdGVhZDsgYm90aCBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGFuZCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhcmUgdmFsaWQgd2F5cyB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uIE5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSBhIG5vbi1gbnVsbGAgdXNlciBkYXRhIG9iamVjdCB2aWEgYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYCwgYW55IHVzZXIgZGF0YSBmaWVsZHMgZW50ZXJlZCB2aWEgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZm9yIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAgd2lsbCBiZSBpZ25vcmVkIHdoZW4gcHJlZmlsbGluZyBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGlkX251bWJlcj86IFVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeWluZyBgdXNlci5jbGllbnRfdXNlcl9pZGAgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHByb3ZpZGUgYGNsaWVudF91c2VyX2lkYCBhdCB0aGUgcm9vdCBsZXZlbCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByZXZpb3VzX2F0dGVtcHRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogRG9jdW1lbnRhcnlWZXJpZmljYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogU2VsZmllQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBSaXNrQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBUaGUgYWRkcmVzcyBtdXN0IGF0IGxlYXN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgdG8gYmUgYSB2YWxpZCBhZGRyZXNzOiBgc3RyZWV0YCwgYGNpdHlgLCBgY291bnRyeWAuIElmIGFueSBhcmUgbWlzc2luZyBvciB1bmFibGUgdG8gYmUgZXh0cmFjdGVkLCB0aGUgYWRkcmVzcyB3aWxsIGJlIG51bGwuICBgcmVnaW9uYCwgYW5kIGBwb3N0YWxfY29kZWAgbWF5IGJlIG51bGwgYmFzZWQgb24gdGhlIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZSAgTm90ZTogT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24gKE9DUikgdGVjaG5vbG9neSBtYXkgc29tZXRpbWVzIGV4dHJhY3QgaW5jb3JyZWN0IGRhdGEgZnJvbSBhIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDaXR5IGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByZXZpb3VzX2F0dGVtcHRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaGFyZWFibGUgVVJMIHRoYXQgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIHVzZXIgdG8gY29tcGxldGUgdmVyaWZpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogRG9jdW1lbnRhcnlWZXJpZmljYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogU2VsZmllQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBSaXNrQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBpZGVudGl0eSB2ZXJpZmljYXRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIFBsYWlkIHNlc3Npb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIFBsYWlkIHNlc3Npb25zXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25zOiBBcnJheTxJZGVudGl0eVZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBvdXRzaWRlIG9mIExpbmssIG1vc3QgbGlrZWx5IHZpYSB5b3VyIG93biBvbmJvYXJkaW5nIHByb2Nlc3MuICBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpdHkgZmllbGRzIGFyZSBvcHRpb25hbDogIGBlbWFpbF9hZGRyZXNzYCAgYHBob25lX251bWJlcmAgIGBkYXRlX29mX2JpcnRoYCAgYG5hbWVgICBgYWRkcmVzc2AgIGBpZF9udW1iZXJgICBTcGVjaWZpY2FsbHksIHRoZXNlIGZpZWxkcyBhcmUgb3B0aW9uYWwgaW4gdGhhdCB0aGV5IGNhbiBlaXRoZXIgYmUgZnVsbHkgcHJvdmlkZWQgKHNhdGlzZnlpbmcgZXZlcnkgcmVxdWlyZWQgZmllbGQgaW4gdGhlaXIgc3Vic2NoZW1hKSBvciBvbWl0dGVkIGZyb20gdGhlIHJlcXVlc3QgZW50aXJlbHkgYnkgbm90IHByb3ZpZGluZyB0aGUga2V5IG9yIHZhbHVlLiBQcm92aWRpbmcgdGhlc2UgZmllbGRzIHZpYSB0aGUgQVBJIHdpbGwgcmVzdWx0IGluIExpbmsgc2tpcHBpbmcgdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBBbGwgdmVyaWZpY2F0aW9uIHN0ZXBzIGVuYWJsZWQgaW4gdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFRlbXBsYXRlIHdpbGwgc3RpbGwgYmUgcnVuLiBWZXJpZmljYXRpb24gc3RlcHMgd2lsbCBlaXRoZXIgYmUgcnVuIGltbWVkaWF0ZWx5LCBvciBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgYGFjY2VwdF90b3NgIHN0ZXAsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgcHJvdmlkZWQgdG8gdGhlIGBnYXZlX2NvbnNlbnRgIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBZb3UgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHByZS1wb3B1bGF0ZSB0aGUgdXNlclxcJ3MgbGVnYWwgbmFtZTsgaWYgaXQgaXMgcHJvdmlkZWQgaGVyZSwgdGhleSB3aWxsIG5vdCBiZSBwcm9tcHRlZCB0byBlbnRlciB0aGVpciBuYW1lIGluIHRoZSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZnVsbCBuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGUgdXNlciBoYXMgbm90IHN1Ym1pdHRlZCB0aGVpciBuYW1lLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBoYXMgYmVlbiByZXRyaWVkLCB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIHZpYSB0aGUgZGFzaGJvYXJkIG9yIHRoZSBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVUUklFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgcmV0cnlpbmcgYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHJhdGVneX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJhdGVneTogU3RyYXRlZ3k7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHN0ZXBzPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc3RydWN0aW9ucyBmb3IgdGhlIGBjdXN0b21gIHJldHJ5IHN0cmF0ZWd5IHNwZWNpZnlpbmcgd2hpY2ggc3RlcHMgc2hvdWxkIGJlIHJlcXVpcmVkIG9yIHNraXBwZWQuICAgTm90ZTogICBUaGlzIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQgd2hlbiB0aGUgcmV0cnkgc3RyYXRlZ3kgaXMgYGN1c3RvbWAgYW5kIG11c3QgYmUgb21pdHRlZCBvdGhlcndpc2UuICBDdXN0b20gcmV0cmllcyBvdmVycmlkZSBzZXR0aW5ncyBpbiB5b3VyIFBsYWlkIFRlbXBsYXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBQbGFpZCBUZW1wbGF0ZSBoYXMgYHZlcmlmeV9zbXNgIGRpc2FibGVkLCBhIGN1c3RvbSByZXRyeSB3aXRoIGB2ZXJpZnlfc21zYCBlbmFibGVkIHdpbGwgc3RpbGwgcmVxdWlyZSB0aGUgc3RlcC4gIFRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzYW5kYm94IHNlcnZlci4gU2FuZGJveCByZXF1ZXN0cyB3aWxsIHNpbGVudGx5IGRpc2FibGUgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAgd2hlbiBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdCB7XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBreWNfY2hlY2tgIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBib29sZWFuO1xufVxuLyoqXG4gKiBBIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IHJlcHJlc2VudHMgYSBjdXN0b21lclxcJ3MgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlaXIgaWRlbnRpdHksIHJlZmxlY3RpbmcgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciBjb21wbGV0aW5nIHRoZSBzZXNzaW9uLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBzdGVwLCBhbmQgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHRoZSBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHNoYXJlYWJsZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogU2VsZmllQ2hlY2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhpcyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC4gICBgYWN0aXZlYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBpcyBpbmNvbXBsZXRlLiBUaGUgdXNlciBtYXkgaGF2ZSBjb21wbGV0ZWQgcGFydCBvZiB0aGUgc2Vzc2lvbiwgYnV0IGhhcyBuZWl0aGVyIGZhaWxlZCBvciBwYXNzZWQuICBgc3VjY2Vzc2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaGFzIGNvbXBsZXRlZCwgcGFzc2luZyBhbGwgc3RlcHMgZGVmaW5lZCB0byB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUgIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIG9uZSBvciBtb3JlIHN0ZXBzIGluIHRoZSBzZXNzaW9uIGFuZCB3YXMgdG9sZCB0byBjb250YWN0IHN1cHBvcnQuICBgZXhwaXJlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGFjdGl2ZSBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lIHdpdGhvdXQgYmVpbmcgY29tcGxldGVkIGFuZCB3YXMgYXV0b21hdGljYWxseSBtYXJrZWQgYXMgZXhwaXJlZC4gTm90ZSB0aGF0IHNlc3Npb25zIGN1cnJlbnRseSBkbyBub3QgZXhwaXJlLiBBdXRvbWF0aWMgZXhwaXJhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBlbmFibGVkIGluIHRoZSBmdXR1cmUuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCwgZWl0aGVyIHZpYSB0aGUgZGFzaGJvYXJkIGJ5IGEgdXNlciwgb3IgdmlhIEFQSS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgb3IgcGFzc2VkLiAgYHBlbmRpbmdfcmV2aWV3YCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB0ZW1wbGF0ZSB3YXMgY29uZmlndXJlZCB0byBwZXJmb3JtIGEgc2NyZWVuaW5nIHRoYXQgaGFkIG9uZSBvciBtb3JlIGhpdHMgbmVlZGluZyByZXZpZXcuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIENhbmNlbGVkID0gJ2NhbmNlbGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3J1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gdXBkYXRlZCwgd2hpY2ggY2FuIGJlIHRyaWdnZXJlZCB2aWEgdGhlIGRhc2hib2FyZCBvciB0aGUgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGEgc3RlcCBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgV2FpdGluZ0ZvclByZXJlcXVpc2l0ZSA9ICd3YWl0aW5nX2Zvcl9wcmVyZXF1aXNpdGUnLFxuICAgIE5vdEFwcGxpY2FibGUgPSAnbm90X2FwcGxpY2FibGUnLFxuICAgIFNraXBwZWQgPSAnc2tpcHBlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBDYW5jZWxlZCA9ICdjYW5jZWxlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgTWFudWFsbHlBcHByb3ZlZCA9ICdtYW51YWxseV9hcHByb3ZlZCcsXG4gICAgTWFudWFsbHlSZWplY3RlZCA9ICdtYW51YWxseV9yZWplY3RlZCdcbn1cblxuLyoqXG4gKiBFYWNoIHN0ZXAgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgYGFjdGl2ZWAgLSBUaGlzIHN0ZXAgaXMgdGhlIHVzZXJcXCdzIGN1cnJlbnQgc3RlcC4gVGhleSBhcmUgZWl0aGVyIGluIHRoZSBwcm9jZXNzIG9mIGNvbXBsZXRpbmcgdGhpcyBzdGVwLCBvciB0aGV5IHJlY2VudGx5IGNsb3NlZCB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgc3RlcC4gT25seSBvbmUgc3RlcCB3aWxsIGJlIG1hcmtlZCBhcyBgYWN0aXZlYCBhdCBhbnkgZ2l2ZW4gcG9pbnQuICBgc3VjY2Vzc2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaGFzIGNvbXBsZXRlZCB0aGlzIHN0ZXAuICBgZmFpbGVkYCAtIFRoZSB1c2VyIGZhaWxlZCB0aGlzIHN0ZXAuIFRoaXMgY2FuIGVpdGhlciBjYWxsIHRoZSB1c2VyIHRvIGZhaWwgdGhlIHNlc3Npb24gYXMgYSB3aG9sZSwgb3IgY2F1c2UgdGhlbSB0byBmYWxsYmFjayB0byBhbm90aGVyIHN0ZXAgZGVwZW5kaW5nIG9uIGhvdyB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlIGlzIGNvbmZpZ3VyZWQuIEEgZmFpbGVkIHN0ZXAgZG9lcyBub3QgaW1wbHkgYSBmYWlsZWQgc2Vzc2lvbi4gIGB3YWl0aW5nX2Zvcl9wcmVyZXF1aXNpdGVgIC0gVGhlIHVzZXIgbmVlZHMgdG8gY29tcGxldGUgYW5vdGhlciBzdGVwIGZpcnN0LCBiZWZvcmUgdGhleSBwcm9ncmVzcyB0byB0aGlzIHN0ZXAuIFRoaXMgc3RlcCBtYXkgbmV2ZXIgcnVuLCBkZXBlbmRpbmcgb24gaWYgdGhlIHVzZXIgZmFpbHMgYW4gZWFybGllciBzdGVwIG9yIGlmIHRoZSBzdGVwIGlzIG9ubHkgcnVuIGFzIGEgZmFsbGJhY2suICBgbm90X2FwcGxpY2FibGVgIC0gVGhpcyBzdGVwIHdpbGwgbm90IGJlIHJ1biBmb3IgdGhpcyBzZXNzaW9uLiAgYHNraXBwZWRgIC0gVGhlIHJldHJ5IGluc3RydWN0aW9ucyB0aGF0IGNyZWF0ZWQgdGhpcyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzcGVjaWZpZWQgdGhhdCB0aGlzIHN0ZXAgc2hvdWxkIGJlIHNraXBwZWQuICBgZXhwaXJlZGAgLSBUaGlzIHN0ZXAgaGFkIG5vdCB5ZXQgYmVlbiBjb21wbGV0ZWQgd2hlbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgYXMgYSB3aG9sZSBleHBpcmVkLiAgYGNhbmNlbGVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgY2FuY2VsZWQgYmVmb3JlIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGlzIHN0ZXAuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy4gIGBtYW51YWxseV9hcHByb3ZlZGAgLSBUaGUgc3RlcCB3YXMgbWFudWFsbHkgb3ZlcnJpZGRlbiB0byBwYXNzIGJ5IGEgdGVhbSBtZW1iZXIgaW4gdGhlIGRhc2hib2FyZC4gIGBtYW51YWxseV9yZWplY3RlZGAgLSBUaGUgc3RlcCB3YXMgbWFudWFsbHkgb3ZlcnJpZGRlbiB0byBmYWlsIGJ5IGEgdGVhbSBtZW1iZXIgaW4gdGhlIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBhY2NlcHRfdG9zOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmeV9zbXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbjogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZzogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIGNvbXBsZXRlZCBhIHN0ZXAgb2YgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNURVBfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc291cmNlIElEIGFuZCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgdGVtcGxhdGUgY29uZmlndXJpbmcgdGhlIGJlaGF2aW9yIG9mIGEgZ2l2ZW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZlcnNpb24gb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2VcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEV2ZW4gaWYgYW4gYWRkcmVzcyBoYXMgYmVlbiBjb2xsZWN0ZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgQWRkcmVzc2VzIGZyb20gSG9uZyBLb25nIHdpbGwgbm90IGluY2x1ZGUgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIHRoZSB1c2VyIGhhcyBzdWJtaXR0ZWQgdGhlaXIgYWRkcmVzcywgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGlkZW50aXR5IGRhdGEgdGhhdCB3YXMgZWl0aGVyIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyIG9yIHByb3ZpZGVkIHZpYSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgaGlnaCBsZXZlbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVhbGl0eSBvZiB0aGUgaW1hZ2UgdGhlIHVzZXIgc3VibWl0dGVkLiAgRm9yIGV4YW1wbGUsIGFuIGltYWdlIHRoYXQgaXMgYmx1cnJ5LCBkaXN0b3J0ZWQgYnkgZ2xhcmUgZnJvbSBhIG5lYXJieSBsaWdodCBzb3VyY2UsIG9yIGltcHJvcGVybHkgZnJhbWVkIG1pZ2h0IGJlIG1hcmtlZCBhcyBsb3cgb3IgbWVkaXVtIHF1YWxpdHkuIFBvb3IgcXVhbGl0eSBpbWFnZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGZhaWwgT0NSIGFuZC9vciB0ZW1wbGF0ZSBjb25mb3JtaXR5IGNoZWNrcy4gIE5vdGU6IEJ5IGRlZmF1bHQsIFBsYWlkIHdpbGwgbGV0IGEgdXNlciByZWNhcHR1cmUgZG9jdW1lbnQgaW1hZ2VzIHR3aWNlIGJlZm9yZSBmYWlsaW5nIHRoZSBlbnRpcmUgc2Vzc2lvbiBpZiB3ZSBhdHRyaWJ1dGUgdGhlIGZhaWx1cmUgdG8gbG93IGltYWdlIHF1YWxpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbWFnZVF1YWxpdHkge1xuICAgIEhpZ2ggPSAnaGlnaCcsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgTG93ID0gJ2xvdydcbn1cblxuLyoqXG4gKiBBbiB1cGRhdGUgb24gdGhlIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRVcGRhdGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgdXBkYXRlIHdhcyBwdWJsaXNoZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtIHtcbiAgICBJbnZlc3RpZ2F0aW5nID0gJ0lOVkVTVElHQVRJTkcnLFxuICAgIElkZW50aWZpZWQgPSAnSURFTlRJRklFRCcsXG4gICAgU2NoZWR1bGVkID0gJ1NDSEVEVUxFRCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnJlYWtkb3duIG9mIHRoZSBkaWZmZXJlbnQgaW5jb21lIHR5cGVzIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZUJyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVCcmVha2Rvd25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBJbmNvbWVCcmVha2Rvd25UeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaG91cmx5IHJhdGUgYXQgd2hpY2ggdGhlIGluY29tZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBob3VycyBsb2dnZWQgZm9yIHRoaXMgaW5jb21lIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHBheSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpbmNvbWUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBcXFwicmVndWxhclxcXCJgOiByZWd1bGFyIGluY29tZSAgIGBcXFwib3ZlcnRpbWVcXFwiYDogb3ZlcnRpbWUgaW5jb21lICAgYFxcXCJib251c1xcXCJgOiBib251cyBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZUJyZWFrZG93blR5cGUge1xuICAgIEJvbnVzID0gJ2JvbnVzJyxcbiAgICBPdmVydGltZSA9ICdvdmVydGltZScsXG4gICAgUmVndWxhciA9ICdyZWd1bGFyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmeSBwYXlyb2xsIGRhdGEgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBheXN0dWJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwYXlzdHVicz86IEFycmF5PFBheXN0dWJPdmVycmlkZT47XG59XG4vKipcbiAqIFRoZSB2ZXJpZmllZCBmaWVsZHMgZnJvbSBhIHBheXN0dWIgdmVyaWZpY2F0aW9uLiBBbGwgZmllbGRzIGFyZSBwcm92aWRlZCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU6IEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVtcGxveWVlX25hbWU6IEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9ncm9zc19pbmNvbWU6IFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB5dGRfbmV0X2luY29tZTogWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwcm9qZWN0ZWRfd2FnZTogUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB2ZXJpZmllZF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25EYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRmllbGQgbnVtYmVyIGZvciBpbmNvbWUgc3VtbWFyeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZW5kcG9pbnQgdG8gd2hpY2ggUGxhaWQgc2hvdWxkIHNlbmQgd2ViaG9va3MgcmVsYXRlZCB0byB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHByZWNoZWNrIGNyZWF0ZWQgd2l0aCBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLiBXaWxsIGJlIHVzZWQgdG8gaW1wcm92ZSBjb252ZXJzaW9uIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogT3B0aW9uYWwgYXJndW1lbnRzIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGUgcHJvZHVjdCBkYXRhLiBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gY29ycmVsYXRlIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSB0aGVzZSBJdGVtcyB3aXRoIGRhdGEgZnJvbSB0aGUgdXNlclxcJ3MgcGF5c3R1Yiwgc3VjaCBhcyBkYXRlIGFuZCBhbW91bnQuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBwcm9kdWN0IHdhcyBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoZSBJdGVtcyBkdXJpbmcgTGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9wdGlvbnMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCBwYXJzaW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnIHtcbiAgICBPY3IgPSAnb2NyJyxcbiAgICBGcmF1ZFJpc2sgPSAnZnJhdWRfcmlzaydcbn1cblxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCBJRCB0byBkb3dubG9hZC4gSWYgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcgemlwIGZpbGUsIHJhdGhlciB0aGFuIGFsbCBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmxvdyB0eXBlcyB0byByZXRyaWV2ZSBwYXlyb2xsIGluY29tZSBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGUge1xuICAgIERpZ2l0YWxJbmNvbWUgPSAncGF5cm9sbF9kaWdpdGFsX2luY29tZScsXG4gICAgRG9jdW1lbnRJbmNvbWUgPSAncGF5cm9sbF9kb2N1bWVudF9pbmNvbWUnXG59XG5cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24gZm9yIHdoaWNoIHRvIGdldCBwYXlzdHViIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1ldGFkYXRhIGZvciBhbiBpbmNvbWUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE/OiBBcnJheTxEb2N1bWVudE1ldGFkYXRhPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yj59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXlzdHViczogQXJyYXk8UGF5c3R1Yj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY29uZmlkZW5jZSB0aGF0IFBsYWlkIGNhbiBzdXBwb3J0IHRoZSB1c2VyIGluIHRoZSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdyBpbnN0ZWFkIG9mIHJlcXVpcmluZyBhIG1hbnVhbCBwYXlzdHViIHVwbG9hZC4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIkhJR0hcXFwiYDogSXQgaXMgdmVyeSBsaWtlbHkgdGhhdCB0aGlzIHVzZXIgY2FuIHVzZSB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuICBcXFwiYExPV2BcXFwiOiBJdCBpcyB1bmxpa2VseSB0aGF0IHRoaXMgdXNlciBjYW4gdXNlIHRoZSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gIGBcXFwiVU5LTk9XTlxcXCJgOiBJdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBpZiB0aGUgdXNlciBpcyBzdXBwb3J0YWJsZSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2Uge1xuICAgIEhpZ2ggPSAnSElHSCcsXG4gICAgTG93ID0gJ0xPVycsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlclxcJ3MgZW1wbG95ZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyXFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyXFwncyB0YXggaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdGF4X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgZW1wbG95ZXJcXCdzIHB1YmxpYyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgbWlsaXRhcnkgaW5mbyBpbiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcmVjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHtcbiAgICAvKipcbiAgICAgKiBJcyB0aGUgdXNlciBjdXJyZW50bHkgYWN0aXZlIGR1dHkgaW4gdGhlIFVTIG1pbGl0YXJ5XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gICAgICovXG4gICAgaXNfYWN0aXZlX2R1dHk/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdXNlciBpcyBjdXJyZW50bHkgc2VydmluZyBpbiB0aGUgVVMgbWlsaXRhcnksIHRoZSBicmFuY2ggb2YgdGhlIG1pbGl0YXJ5IGluIHdoaWNoIHRoZXkgYXJlIHNlcnZpbmcgVmFsaWQgdmFsdWVzOiBcXCdBSVIgRk9SQ0VcXCcsIFxcJ0FSTVlcXCcsIFxcJ0NPQVNUIEdVQVJEXFwnLCBcXCdNQVJJTkVTXFwnLCBcXCdOQVZZXFwnLCBcXCdVTktOT1dOXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAgICAgKi9cbiAgICBicmFuY2g/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIHBheXJvbGwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiBwYXlyb2xsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5cm9sbF9pbnN0aXR1dGlvbj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcHJlY2hlY2suIFByb3ZpZGUgdGhpcyB2YWx1ZSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW4gb3JkZXIgdG8gb3B0aW1pemUgTGluayBjb252ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmVjaGVja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmaXJzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgZmlyc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGxhc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGhvbWVfYWRkcmVzcz86IFNpZ25hbEFkZHJlc3NEYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgYXR0ZW1wdCB0byByZWZyZXNoIFBheXJvbGwgSW5jb21lIGRhdGEgZm9yIGEgdXNlciB2aWEgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgZmFpbGVkIGJlY2F1c2UgdGhlIHVzZXIgbXVzdCByZS1jb25uZWN0IHRoZWlyIHBheXJvbGwgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JFRlJFU0hfUkVDT05ORUNUX05FRURFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiByaXNrIHNpZ25hbHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgZG9jdW1lbnRzIHVwbG9hZGVkIHZpYSBEb2N1bWVudCBJbmNvbWUuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2UgYSBtaW51dGUgb3IgdHdvIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgbWF5IHRoZW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGFuZCB0byByZXRyaWV2ZSByaXNrIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFxcXCJJTkNPTUVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSSVNLX1NJR05BTFNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZyYXVkIGRldGVjdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBlbmRwb2ludCB0byBnZXQgYWxsIHJpc2sgc2lnbmFsIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgcmlza19zaWduYWxzX3N0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgdHlwZXMgb2Ygc291cmNlIGluY29tZSBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGUge1xuICAgIEJhbmsgPSAnYmFuaycsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlIGhhcyBjaGFuZ2VkLiBJdCB3aWxsIHR5cGljYWxseSB0YWtlIHNldmVyYWwgbWludXRlcyBmb3IgdGhpcyB3ZWJob29rIHRvIGZpcmUgYWZ0ZXIgdGhlIGVuZCB1c2VyIGhhcyB1cGxvYWRlZCB0aGVpciBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFxcXCJJTkNPTUVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgOiAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBkb2N1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgb3IgdGhhdCB0aGUgZG9jdW1lbnRzIHdlcmUgbm90IHBhcnNhYmxlLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBbiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIG9jY3VycmVkIHdoZW4gYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZSB2ZXJpZmljYXRpb24gZG9jdW1lbnRhdGlvbi4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BFTkRJTkdfQVBQUk9WQUxgOiAoZGVwcmVjYXRlZCkgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2VudCB0byB0aGUgdXNlciBmb3IgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5QYXJlbnQgY29udGFpbmVyIGZvciBuYW1lIHRoYXQgYWxsb3dzIGZvciBjaG9pY2UgZ3JvdXAgYmV0d2VlbiBwYXJzZWQgYW5kIHVucGFyc2VkIGNvbnRhaW5lcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIExhc3ROYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwsIGluY2x1ZGluZyBhbGwgcGFydHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgbmFtZXMgYXJlIHRob3NlIG1vc3QgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byB0aGlzIHBlcnNvbi4gT25seSBvbmUgbmFtZSB3aWxsIGV2ZXIgYmUgbWFya2VkIGFzIHByaW1hcnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIHdlYWtfYWxpYXNfZGV0ZXJtaW5hdGlvbjogV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbjtcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGluZGl2aWR1YWxzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX0NJQWA6IENJQSBMaXN0IG9mIENoaWVmcyBvZiBTdGF0ZSBhbmQgQ2FiaW5ldCBNZW1iZXJzICBgSVpfSVBMYDogSW50ZXJwb2wgUmVkIE5vdGljZXMgZm9yIFdhbnRlZCBQZXJzb25zIExpc3QgIGBJWl9QRVBgOiBQb2xpdGljYWxseSBFeHBvc2VkIFBlcnNvbnMgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVS19ITUNgOiBVSyBITSBUcmVhc3VyeSBDb25zb2xpZGF0ZWQgTGlzdCAgYFVTX0RQTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgRGVuaWVkIFBlcnNvbnMgTGlzdCAgYFVTX0RUQ2A6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgQUVDQSBEZWJhcnJlZCAgYFVTX0ZCSWA6IFVTIERlcGFydG1lbnQgb2YgSnVzdGljZSBGQkkgV2FudGVkIExpc3QgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19JU05gOiBVUyBEZXBhcnRtZW50IG9mIFN0YXRlIE5vbnByb2xpZmVyYXRpb24gU2FuY3Rpb25zICBgVVNfUExDYDogVVMgT0ZBQyBQYWxlc3RpbmlhbiBMZWdpc2xhdGl2ZSBDb3VuY2lsICBgVVNfU0ROYDogVVMgT0ZBQyBTcGVjaWFsbHkgRGVzaWduYXRlZCBOYXRpb25hbHMgTGlzdCAgYFVTX1NTSWA6IFVTIE9GQUMgU2VjdG9yYWwgU2FuY3Rpb25zIElkZW50aWZpY2F0aW9ucyAgYFNHX1NPRmA6IEdvdmVybm1lbnQgb2YgU2luZ2Fwb3JlIFRlcnJvcmlzdHMgYW5kIFRlcnJvcmlzdCBFbnRpdGllcyAgYFRSX1RXTGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFRlcnJvcmlzdCBXYW50ZWQgTGlzdCAgYFRSX0RGRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IERvbWVzdGljIEZyZWV6aW5nIERlY2lzaW9ucyAgYFRSX0ZPUmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IEZvcmVpZ24gRnJlZXppbmcgUmVxdWVzdHMgIGBUUl9XTURgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBXZWFwb25zIG9mIE1hc3MgRGVzdHJ1Y3Rpb24gIGBUUl9DTUJgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBDYXBpdGFsIE1hcmtldHMgQm9hcmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlIHtcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJekNpYSA9ICdJWl9DSUEnLFxuICAgIEl6SXBsID0gJ0laX0lQTCcsXG4gICAgSXpQZXAgPSAnSVpfUEVQJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVWtIbWMgPSAnVUtfSE1DJyxcbiAgICBVc0RwbCA9ICdVU19EUEwnLFxuICAgIFVzRHRjID0gJ1VTX0RUQycsXG4gICAgVXNGYmkgPSAnVVNfRkJJJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzSXNuID0gJ1VTX0lTTicsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1BsYyA9ICdVU19QTEMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBTZ1NvZiA9ICdTR19TT0YnLFxuICAgIFRyVHdsID0gJ1RSX1RXTCcsXG4gICAgVHJEZmQgPSAnVFJfREZEJyxcbiAgICBUckZvciA9ICdUUl9GT1InLFxuICAgIFRyV21kID0gJ1RSX1dNRCcsXG4gICAgVHJDbWIgPSAnVFJfQ01CJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2UgcmVndWxhciBwYXltZW50cyBvbiBhIGxvYW4uIEFueSB0cmFuc2FjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBgaW5mbG93X21vZGVsYCB3aWxsIGFwcGVhciBpbiBhZGRpdGlvbiB0byByYW5kb21seSBnZW5lcmF0ZWQgdGVzdCBkYXRhIG9yIHRyYW5zYWN0aW9ucyBzcGVjaWZpZWQgYnkgYG92ZXJyaWRlX2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5mbG93TW9kZWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluZmxvd01vZGVsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW5mbG93IG1vZGVsLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBub25lYDogTm8gaW5jb21lICBgbW9udGhseS1pbmNvbWVgOiBJbmNvbWUgb2NjdXJzIG9uY2UgcGVyIG1vbnRoIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGA6IFBheXMgb2ZmIHRoZSBiYWxhbmNlIG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgOiBNYWtlcyBhbiBpbnRlcmVzdC1vbmx5IHBheW1lbnQgb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIE5vdGUgdGhhdCBhY2NvdW50IHR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcyB3aWxsIGFjY3J1ZSBpbnRlcmVzdCBpbiB0aGUgU2FuZGJveC4gVGhlIHR5cGVzIGltcGFjdGVkIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBzdWJ0eXBlIGBjcmVkaXRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGluY29tZSBwZXIgbW9udGguIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBpbmNvbWVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24gd2lsbCBhcHBlYXIuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHBheW1lbnRfZGF5X29mX21vbnRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgYmFsYW5jZSBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRfZGF5X29mX21vbnRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gSWYgW0FjY291bnQgU2VsZWN0IHYyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvY3VzdG9taXphdGlvbi8jYWNjb3VudC1zZWxlY3QpIGlzIGVuYWJsZWQsIHRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERldGFpbHMgcmVsYXRpbmcgdG8gYSBzcGVjaWZpYyBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIG1heSBoYXZlIG11bHRpcGxlIHJlY29yZHMsIGVhY2ggd2l0aCBkaWZmZXJlbnQgaW5zdGl0dXRpb24gSURzOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RpdHV0aW9uIGhhcyBtaWdyYXRlZCB0byBPQXV0aCwgdGhlcmUgbWF5IGJlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciB0aGUgT0F1dGggYW5kIG5vbi1PQXV0aCB2ZXJzaW9ucyBvZiB0aGUgaW5zdGl0dXRpb24uIEluc3RpdHV0aW9ucyB0aGF0IG9wZXJhdGUgaW4gZGlmZmVyZW50IGNvdW50cmllcyBvciB3aXRoIG11bHRpcGxlIGxvZ2luIHBvcnRhbHMgbWF5IGFsc28gaGF2ZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgZWFjaCBjb3VudHJ5IG9yIHBvcnRhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgUGxhaWQgcHJvZHVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IG9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IEF1dGggd2lsbCByZXR1cm4gYGF1dGhgIGluIHRoZSBwcm9kdWN0IGFycmF5OyBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgbGlzdCBgYXV0aGAgbWF5IHN0aWxsIHN1cHBvcnQgb3RoZXIgQXV0aCBtZXRob2RzIHN1Y2ggYXMgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBWZXJpZmljYXRpb24uIFRvIGlkZW50aWZ5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgbWV0aG9kcywgdXNlIHRoZSBgYXV0aF9tZXRhZGF0YWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0Z1bGwgQXV0aCBjb3ZlcmFnZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgY291bnRyeSBjb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBpbnN0aXR1dGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpbWFyeSBjb2xvciB1c2VkIGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcHJpbWFyeV9jb2xvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQmFzZTY0IGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBsb2dvLCByZXR1cm5lZCBhcyBhIGJhc2U2NCBlbmNvZGVkIDE1MngxNTIgUE5HLiBOb3QgYWxsIGluc3RpdHV0aW9uc1xcJyBsb2dvcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbG9nbz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIG5vdCBjb21wcmVoZW5zaXZlIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBhcyBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBpbmNsdWRlX3N0YXR1c2Agb3B0aW9uIHNldCB0byB0cnVlLiBOb3RlIHRoYXQgaW5zdGl0dXRpb24gc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpdGVtX2xvZ2lucz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgYXV0aD86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiByZWNlbnQgaGVhbHRoIGluY2lkZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxIZWFsdGhJbmNpZGVudD59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaGVhbHRoX2luY2lkZW50cz86IEFycmF5PEhlYWx0aEluY2lkZW50PiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaW5zdGl0dXRpb24gc3RhdHVzIG1lZXRzIHRoZSBjb25kaXRpb25zIGNvbmZpZ3VyZWQgaW4gdGhlIGRldmVsb3BlciBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBEQVNIQk9BUkRfQ09ORklHVVJFRF9BTEVSVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNUSVRVVElPTl9TVEFUVVNfQUxFUlRfVFJJR0dFUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZ2xvYmFsIHN1Y2Nlc3MgcmF0ZSBvZiB0aGUgaW5zdGl0dXRpb24sIGNhbGN1bGF0ZWQgYmFzZWQgb24gaXRlbSBhZGQgaGVhbHRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fb3ZlcmFsbF9zdWNjZXNzX3JhdGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBSVFAgbmV0d29yayBhbmQgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFB9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAgICAgKi9cbiAgICBydHA6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdG8gZ2V0IGRldGFpbHMgYWJvdXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiBhbiBpbnN0aXR1dGlvblxcJ3MgbG9nbywgYnJhbmQgY29sb3IsIGFuZCBVUkwuIFdoZW4gYXZhaWxhYmxlLCB0aGUgYmFua1xcJ3MgbG9nbyBpcyByZXR1cm5lZCBhcyBhIGJhc2U2NCBlbmNvZGVkIDE1MngxNTIgUE5HLCB0aGUgYnJhbmQgY29sb3IgaXMgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RpdHV0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfc3RhdHVzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogSW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHNraXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuICBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW5zdGl0dXRpb25zL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGljaCBwcm9kdWN0cyB0aGV5IHN1cHBvcnQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2Ygcm91dGluZyBudW1iZXJzIHRvIGZpbHRlciBpbnN0aXR1dGlvbnMuIFRoZSByZXNwb25zZSB3aWxsIG9ubHkgcmV0dXJuIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIGFsbCBvZiB0aGUgcm91dGluZyBudW1iZXJzIGluIHRoZSBhcnJheS4gUm91dGluZyBudW1iZXIgcmVjb3JkcyB1c2VkIGZvciB0aGlzIG1hdGNoaW5nIGFyZSBub3QgY29tcHJlaGVuc2l2ZTsgZmFpbHVyZSB0byBtYXRjaCBhIGdpdmVuIHJvdXRpbmcgbnVtYmVyIHRvIGFuIGluc3RpdHV0aW9uIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgaW5zdGl0dXRpb24gaXMgdW5zdXBwb3J0ZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXJzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBOb3RlIHRoYXQgaW5zdGl0dXRpb25zIHdpbGwgaGF2ZSBgb2F1dGhgIHNldCB0byBgdHJ1ZWAgaWYgc29tZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQgdG8gdXNlIE9BdXRoIGZsb3dzOyBpbnN0aXR1dGlvbnMgaW4gYSBzdGF0ZSBvZiBtaWdyYXRpb24gdG8gT0F1dGggd2lsbCBoYXZlIHRoZSBgb2F1dGhgIGF0dHJpYnV0ZSBzZXQgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci4gIE5vdGUgdGhhdCBQbGFpZCBkb2VzIG5vdCBvd24gYW55IG9mIHRoZSBsb2dvcyBzaGFyZWQgYnkgdGhlIEFQSSwgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBQbGFpZCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSB2aWEgdGhpcyBlbmRwb2ludFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGFjY291bnQgZmlsdGVyIHRvIGFwcGx5IHRvIGluc3RpdHV0aW9ucyBzZWFyY2ggcmVxdWVzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgaW5zdGl0dXRpb25zIGJ5IHZhcmlvdXMgUGF5bWVudCBJbml0aWF0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL3NlYXJjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkuIEluc3RpdHV0aW9ucyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBxdWVyeSBhcmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgc3VwcG9ydCBhbGwgcHJvZHVjdHMgbGlzdGVkIGluIGBwcm9kdWN0c2AuIFByb3ZpZGUgYG51bGxgIHRvIGdldCBpbnN0aXR1dGlvbnMgcmVnYXJkbGVzcyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMuIE5vdGUgdGhhdCB3aGVuIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBpZiB5b3UgYXJlIGVuYWJsZWQgZm9yIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQgZXZlbiBpZiBgYXV0aGAgaXMgbm90IHByZXNlbnQgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gTm90ZSB0aGF0IGluc3RpdHV0aW9ucyB3aWxsIGhhdmUgYG9hdXRoYCBzZXQgdG8gYHRydWVgIGlmIHNvbWUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5zdGl0dXRpb24gYXJlIHJlcXVpcmVkIHRvIHVzZSBPQXV0aCBmbG93czsgaW5zdGl0dXRpb25zIGluIGEgc3RhdGUgb2YgbWlncmF0aW9uIHRvIE9BdXRoIHdpbGwgaGF2ZSB0aGUgYG9hdXRoYCBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL3NlYXJjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5zdGl0dXRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWludmVzdG1lbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgXzQwMWEgPSAnNDAxYScsXG4gICAgXzQwMWsgPSAnNDAxaycsXG4gICAgXzQwM0IgPSAnNDAzQicsXG4gICAgXzQ1N2IgPSAnNDU3YicsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgQ3J5cHRvRXhjaGFuZ2UgPSAnY3J5cHRvIGV4Y2hhbmdlJyxcbiAgICBFZHVjYXRpb25TYXZpbmdzQWNjb3VudCA9ICdlZHVjYXRpb24gc2F2aW5ncyBhY2NvdW50JyxcbiAgICBGaXhlZEFubnVpdHkgPSAnZml4ZWQgYW5udWl0eScsXG4gICAgR2ljID0gJ2dpYycsXG4gICAgSGVhbHRoUmVpbWJ1cnNlbWVudEFycmFuZ2VtZW50ID0gJ2hlYWx0aCByZWltYnVyc2VtZW50IGFycmFuZ2VtZW50JyxcbiAgICBIc2EgPSAnaHNhJyxcbiAgICBJcmEgPSAnaXJhJyxcbiAgICBJc2EgPSAnaXNhJyxcbiAgICBLZW9naCA9ICdrZW9naCcsXG4gICAgTGlmID0gJ2xpZicsXG4gICAgTGlmZUluc3VyYW5jZSA9ICdsaWZlIGluc3VyYW5jZScsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTXV0dWFsRnVuZCA9ICdtdXR1YWwgZnVuZCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBRc2hyID0gJ3FzaHInLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJsaWYgPSAncmxpZicsXG4gICAgUm90aCA9ICdyb3RoJyxcbiAgICBSb3RoNDAxayA9ICdyb3RoIDQwMWsnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUnJzcCA9ICdycnNwJyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eScsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHdpdGhpbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJbnZlc3RtZW50IHRyYW5zYWN0aW9uLCB1bmlxdWUgYWNyb3NzIGFsbCBQbGFpZCB0cmFuc2FjdGlvbnMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxlZ2FjeSBmaWVsZCBmb3JtZXJseSB1c2VkIGludGVybmFsbHkgYnkgUGxhaWQgdG8gaWRlbnRpZnkgY2VydGFpbiBjYW5jZWxlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYW5jZWxfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWN1cml0eV9pZGAgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBpcyByZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBwb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9u4oCZcyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIGZvciBidXkgdHJhbnNhY3Rpb25zOyBuZWdhdGl2ZSBmb3Igc2VsbCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21iaW5lZCB2YWx1ZSBvZiBhbGwgZmVlcyBhcHBsaWVkIHRvIHRoaXMgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZvciBkZXNjcmlwdGlvbnMgb2YgcG9zc2libGUgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtJbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2ludmVzdG1lbnQtdHJhbnNhY3Rpb24tdHlwZXMtc2NoZW1hKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGUge1xuICAgIEFjY291bnRGZWUgPSAnYWNjb3VudCBmZWUnLFxuICAgIEFkanVzdG1lbnQgPSAnYWRqdXN0bWVudCcsXG4gICAgQXNzaWdubWVudCA9ICdhc3NpZ25tZW50JyxcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBCdXlUb0NvdmVyID0gJ2J1eSB0byBjb3ZlcicsXG4gICAgQ29udHJpYnV0aW9uID0gJ2NvbnRyaWJ1dGlvbicsXG4gICAgRGVwb3NpdCA9ICdkZXBvc2l0JyxcbiAgICBEaXN0cmlidXRpb24gPSAnZGlzdHJpYnV0aW9uJyxcbiAgICBEaXZpZGVuZCA9ICdkaXZpZGVuZCcsXG4gICAgRGl2aWRlbmRSZWludmVzdG1lbnQgPSAnZGl2aWRlbmQgcmVpbnZlc3RtZW50JyxcbiAgICBFeGVyY2lzZSA9ICdleGVyY2lzZScsXG4gICAgRXhwaXJlID0gJ2V4cGlyZScsXG4gICAgRnVuZEZlZSA9ICdmdW5kIGZlZScsXG4gICAgSW50ZXJlc3QgPSAnaW50ZXJlc3QnLFxuICAgIEludGVyZXN0UmVjZWl2YWJsZSA9ICdpbnRlcmVzdCByZWNlaXZhYmxlJyxcbiAgICBJbnRlcmVzdFJlaW52ZXN0bWVudCA9ICdpbnRlcmVzdCByZWludmVzdG1lbnQnLFxuICAgIExlZ2FsRmVlID0gJ2xlZ2FsIGZlZScsXG4gICAgTG9hblBheW1lbnQgPSAnbG9hbiBwYXltZW50JyxcbiAgICBMb25nVGVybUNhcGl0YWxHYWluID0gJ2xvbmctdGVybSBjYXBpdGFsIGdhaW4nLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIE1hbmFnZW1lbnRGZWUgPSAnbWFuYWdlbWVudCBmZWUnLFxuICAgIE1hcmdpbkV4cGVuc2UgPSAnbWFyZ2luIGV4cGVuc2UnLFxuICAgIE1lcmdlciA9ICdtZXJnZXInLFxuICAgIE1pc2NlbGxhbmVvdXNGZWUgPSAnbWlzY2VsbGFuZW91cyBmZWUnLFxuICAgIE5vblF1YWxpZmllZERpdmlkZW5kID0gJ25vbi1xdWFsaWZpZWQgZGl2aWRlbmQnLFxuICAgIE5vblJlc2lkZW50VGF4ID0gJ25vbi1yZXNpZGVudCB0YXgnLFxuICAgIFBlbmRpbmdDcmVkaXQgPSAncGVuZGluZyBjcmVkaXQnLFxuICAgIFBlbmRpbmdEZWJpdCA9ICdwZW5kaW5nIGRlYml0JyxcbiAgICBRdWFsaWZpZWREaXZpZGVuZCA9ICdxdWFsaWZpZWQgZGl2aWRlbmQnLFxuICAgIFJlYmFsYW5jZSA9ICdyZWJhbGFuY2UnLFxuICAgIFJldHVybk9mUHJpbmNpcGFsID0gJ3JldHVybiBvZiBwcmluY2lwYWwnLFxuICAgIFJlcXVlc3QgPSAncmVxdWVzdCcsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBTZWxsU2hvcnQgPSAnc2VsbCBzaG9ydCcsXG4gICAgU2VuZCA9ICdzZW5kJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpbiA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBTcGluT2ZmID0gJ3NwaW4gb2ZmJyxcbiAgICBTcGxpdCA9ICdzcGxpdCcsXG4gICAgU3RvY2tEaXN0cmlidXRpb24gPSAnc3RvY2sgZGlzdHJpYnV0aW9uJyxcbiAgICBUYXggPSAndGF4JyxcbiAgICBUYXhXaXRoaGVsZCA9ICd0YXggd2l0aGhlbGQnLFxuICAgIFRyYWRlID0gJ3RyYWRlJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgVHJhbnNmZXJGZWUgPSAndHJhbnNmZXIgZmVlJyxcbiAgICBUcnVzdEZlZSA9ICd0cnVzdCBmZWUnLFxuICAgIFVucXVhbGlmaWVkR2FpbiA9ICd1bnF1YWxpZmllZCBnYWluJyxcbiAgICBXaXRoZHJhd2FsID0gJ3dpdGhkcmF3YWwnXG59XG5cbi8qKlxuICogVmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGBidXlgOiBCdXlpbmcgYW4gaW52ZXN0bWVudCBgc2VsbGA6IFNlbGxpbmcgYW4gaW52ZXN0bWVudCBgY2FuY2VsYDogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uIGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHdoaWNoIG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlciAgRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQnV5ID0gJ2J1eScsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBDYW5jZWwgPSAnY2FuY2VsJyxcbiAgICBDYXNoID0gJ2Nhc2gnLFxuICAgIEZlZSA9ICdmZWUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJ1xufVxuXG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNBVFM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYWNhdHM/OiBBcnJheTxOdW1iZXJzQUNBVFM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQVRPTj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhdG9uPzogQXJyYXk8TnVtYmVyc0FUT04+O1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIGRhdGEgaXMgYmVpbmcgcmV0cmlldmVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVycyBmb3IgdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRzQXV0aE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PEludmVzdG1lbnRzQXV0aE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiB0aGUgb3duZXJzaGlwIG9mIGFuIGludmVzdG1lbnRzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aE93bmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBpZGVudGl0eSBpbmZvcm1hdGlvbiBwZXJ0YWlucyB0b1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aE93bmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aE93bmVyXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNhbmNlbGVkIHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGNhbmNlbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBhZnRlciBhbiBhc3luY2hyb25vdXMgZXh0cmFjdGlvbiBvbiBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gc2tpcCB3aGVuIGZldGNoaW5nIHRyYW5zYWN0aW9uIGhpc3RvcnlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaW52ZXN0bWVudHMgcHJvZHVjdCB2aWEgdGhlIGBwcm9kdWN0c2AgYXJyYXkgd2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQgYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUsIHRoZSBpbml0aWFsIEludmVzdG1lbnRzIGV4dHJhY3Rpb24gd2lsbCBoYXBwZW4gYXN5bmNocm9ub3VzbHkuIFBsYWlkIHdpbGwgc3Vic2VxdWVudGx5IGZpcmUgYSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2hlbiB0aGUgZXh0cmFjdGlvbiBjb21wbGV0ZXMuIFdoZW4gYGZhbHNlYCwgUGxhaWQgd2lsbCB3YWl0IHRvIHJldHVybiBhIHJlc3BvbnNlIHVudGlsIGV4dHJhY3Rpb24gY29tcGxldGlvbiBhbmQgbm8gYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rIHdpbGwgZmlyZS4gTm90ZSB0aGF0IHdoaWxlIHRoZSBleHRyYWN0aW9uIGlzIGhhcHBlbmluZyBhc3luY2hyb25vdXNseSwgY2FsbHMgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCB3aWxsIHJldHVybiBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9ycyB1bnRpbCB0aGUgZXh0cmFjdGlvbiBjb21wbGV0ZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhc3luY191cGRhdGU/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFsbCBzZWN1cml0aWVzIGZvciB3aGljaCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgdHJhbnNhY3Rpb24gYmVpbmcgZmV0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbnMgYmVpbmcgZmV0Y2hlZFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBsaXN0IG9mIGludmVzdG1lbnRzIHRyYW5zYWN0aW9ucyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogUG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIE11c3QgYmUgcG9zaXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBidXkgYW5kIG5lZ2F0aXZlIGlmIHRoZSB0eXBlIGlzIGEgc2VsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZmVlcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eT86IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEEgYmluYXJ5IG1hdGNoIGluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGNvdW50cnkgdGhhdCBpc3N1ZWQgdGhlIHByb3ZpZGVkIGRvY3VtZW50IG1hdGNoZXMgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIFBsYWlkLiAgTm90ZTogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciBhIGBub19tYXRjaGAgb24gYGlzc3VpbmdfY291bnRyeWAgZmFpbHMgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGJ5IGVkaXRpbmcgeW91ciBQbGFpZCBUZW1wbGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElzc3VpbmdDb3VudHJ5IHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCdcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3MgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gYWNjZXNzZWQuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IHdpbGwgYmUgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGJpbGxlZF9wcm9kdWN0c2AuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGF2YWlsYWJsZV9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbiBiaWxsZWQgZm9yIHRoZSBJdGVtLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhdmFpbGFibGVfcHJvZHVjdHNgLiBOb3RlIC0gYGJpbGxlZF9wcm9kdWN0c2AgaXMgcG9wdWxhdGVkIGluIGFsbCBlbnZpcm9ubWVudHMgYnV0IG9ubHkgcmVxdWVzdHMgaW4gUHJvZHVjdGlvbiBhcmUgYmlsbGVkLiBBbHNvIG5vdGUgdGhhdCBwcm9kdWN0cyB0aGF0IGFyZSBiaWxsZWQgb24gYSBwYXktcGVyLWNhbGwgYmFzaXMgcmF0aGVyIHRoYW4gYSBwYXktcGVyLUl0ZW0gYmFzaXMsIHN1Y2ggYXMgYGJhbGFuY2VgLCB3aWxsIG5vdCBhcHBlYXIgaGVyZS4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGJpbGxlZF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhZGRlZCB0byB0aGUgSXRlbS4gSW4gYWxtb3N0IGFsbCBjYXNlcywgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBgYmlsbGVkX3Byb2R1Y3RzYCBmaWVsZC4gRm9yIHNvbWUgcHJvZHVjdHMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhbiBJdGVtIGJ1dCBub3QgeWV0IGJpbGxlZCAoZS5nLiBBc3NldHMsIGJlZm9yZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGhhcyBiZWVuIGNhbGxlZCwgb3IgQXV0aCBvciBJZGVudGl0eSB3aGVuIGFkZGVkIGFzIE9wdGlvbmFsIFByb2R1Y3RzIGJ1dCBiZWZvcmUgdGhlaXIgZW5kcG9pbnRzIGhhdmUgYmVlbiBjYWxsZWQpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9kdWN0IG1heSBhcHBlYXIgaW4gYHByb2R1Y3RzYCBidXQgbm90IGluIGBiaWxsZWRfcHJvZHVjdHNgLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgaGF2ZSBnb25lIHRocm91Z2ggY29uc2VudCBjb2xsZWN0aW9uIGZvciB0aGUgSXRlbS4gT25seSBwcmVzZW50IGZvciB0aG9zZSBlbmFibGVkIGluIHRoZSBbRGF0YSBUcmFuc3BhcmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKSBiZXRhLiBJZiB5b3UgYXJlIG5vdCBlbnJvbGxlZCBpbiBEYXRhIFRyYW5zcGFyZW5jeSwgdGhpcyBmaWVsZCBpcyBub3QgdXNlZC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGNvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgUkZDIDMzMzkgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBjb25zZW50IHByb3ZpZGVkIGJ5IHRoZSBlbmQgdXNlciB3aWxsIGV4cGlyZS4gVXBvbiBjb25zZW50IGV4cGlyYXRpb24sIHRoZSBpdGVtIHdpbGwgZW50ZXIgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZS4gVG8gY2lyY3VtdmVudCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIGFuZCBtYWludGFpbiBjb250aW51b3VzIGNvbnNlbnQsIHRoZSBlbmQgdXNlciBjYW4gcmVhdXRoZW50aWNhdGUgdmlhIExpbmvigJlzIHVwZGF0ZSBtb2RlIGluIGFkdmFuY2Ugb2YgdGhlIGNvbnNlbnQgZXhwaXJhdGlvbiB0aW1lLiAgTm90ZSAtIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdGhlIGNhc2UgZm9yIEl0ZW1zIHdpdGggc29tZSBmb3JtcyBvZiB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uLiAgYGJhY2tncm91bmRgIC0gSXRlbSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCAgYHVzZXJfcHJlc2VudF9yZXF1aXJlZGAgLSBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVfdHlwZTogSXRlbVVwZGF0ZVR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEl0ZW1VcGRhdGVUeXBlRW51bSB7XG4gICAgQmFja2dyb3VuZCA9ICdiYWNrZ3JvdW5kJyxcbiAgICBVc2VyUHJlc2VudFJlcXVpcmVkID0gJ3VzZXJfcHJlc2VudF9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG5ld19hY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHRvIGxpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEFjdGl2aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWN0aXZpdGllczogQXJyYXk8QWN0aXZpdHk+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aW1lc3RhbXBzIGZvciB0aGUgbGFzdCB0aW1lIGVhY2ggZGF0YSB0eXBlIHdhcyBhY2Nlc3NlZCBwZXIgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PExhc3REYXRhQWNjZXNzVGltZXM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2RhdGFfYWNjZXNzX3RpbWVzOiBBcnJheTxMYXN0RGF0YUFjY2Vzc1RpbWVzPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBjb25uZWN0ZWQgYXBwbGljYXRpb25zIGZvciBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbnM6IEFycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogVXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLCBmb3IgY2xpZW50cyBtYWtpbmcgYSByZXF1ZXN0IHdpdGhvdXQgYW4gYGFjY2Vzc190b2tlbmAuIFRoaXMgaXMgb25seSBhbGxvd2VkIGZvciBzZWxlY3QgY2xpZW50cyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE1vc3QgY2xpZW50cyBzaG91bGQgY2FsbCAvaXRlbS9pbXBvcnQgdG8gb2J0YWluIGFuIGFjY2VzcyB0b2tlbiBiZWZvcmUgbWFraW5nIGEgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZSBoYXNoZWQgYnkgRkkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgZmlfdXNlcm5hbWVfaGFzaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY29wZXM6IFNjb3BlcztcbiAgICAvKipcbiAgICAgKiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBkdXJpbmcgZW5yb2xsbWVudCwgdGhpcyBmaWVsZCBtdXN0IGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzdGF0ZSBzZW50IHRvIHRoZSBwYXJ0bmVyIGluIHRoZSBPQXV0aCBMb2dpbiBVUkkuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgd2hlbiB0aGUgY29udGV4dCBpcyBgRU5ST0xMTUVOVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNDb250ZXh0fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29udGV4dDogU2NvcGVzQ29udGV4dDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rL2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2l0aCBhbiBJdGVtLiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtRXJyb3JXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtRXJyb3JXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YCBhbmQgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEl0ZW1TdGF0dXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcHJvZHVjdCBzdHJpbmdzXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRofVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfYXV0aDogSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUltcG9ydFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBjb25maWd1cmUgYC9pdGVtL2ltcG9ydGAgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIGFuIEl0ZW0uIFBsYWlkIGZpcmVzIGEgd2ViaG9vayBpZiBjcmVkZW50aWFscyBmYWlsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3Qgb2YgdXNlciBJRCBhbmQgYXV0aCB0b2tlbiBwYWlyLCBwZXJtaXR0aW5nIFBsYWlkIHRvIGFnZ3JlZ2F0ZSBhIHVzZXLigJlzIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIE9wYXF1ZSB1c2VyIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEF1dGhvcml6YXRpb24gdG9rZW4gUGxhaWQgd2lsbCB1c2UgdG8gYWdncmVnYXRlIHRoaXMgdXNlcuKAmXMgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgYXV0aF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaGFzIGV4aXRlZCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIGdvbmUgdGhyb3VnaCB0aGUgdXBkYXRlIG1vZGUgZmxvdyBpbiB5b3VyIGFwcCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGUgdXBkYXRlIG1vZGUgaW4gYSBkaWZmZXJlbnQgYXBwKS4gSWYgeW91IGhhdmUgbWVzc2FnaW5nIHRoYXQgdGVsbHMgdGhlIHVzZXIgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSBtb2RlIGZsb3csIHlvdSBzaG91bGQgc2lsZW5jZSB0aGlzIG1lc3NhZ2luZyB1cG9uIHJlY2VpdmluZyB0aGUgYExPR0lOX1JFUEFJUkVEYCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMT0dJTl9SRVBBSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIG9uY2UgUGxhaWQgY2FsY3VsYXRlcyBpbmNvbWUgZnJvbSBhbiBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBgcHVibGljX3Rva2VuYCBmb3IgdGhlIHBhcnRpY3VsYXIgSXRlbSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYGFjY2Vzc190b2tlbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBgcHVibGljX3Rva2VuYCwgb2J0YWluZWQgZnJvbSB0aGUgTGluayBgb25TdWNjZXNzYCBjYWxsYmFjayBvciBgL3NhbmRib3gvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgdmFsdWUgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBgYWNjZXNzX3Rva2VuYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIGZhaWxzIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB3ZWJob29rIGZpcmVkIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgd2ViaG9vayB3YXMgZmlyZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIHNlbnRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHdlYmhvb2sgY29kZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIGNvZGVfc2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogSXRlbVN0YXR1c0ludmVzdG1lbnRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgbGFzdF9zdWNjZXNzZnVsX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggdGhlIEl0ZW0uIFRvIHJlbW92ZSBhIHdlYmhvb2sgZnJvbSBhbiBJdGVtLCBzZXQgdG8gYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggW0pXVCBsaWJyYXJpZXNdKGh0dHBzOi8vand0LmlvLyNsaWJyYXJpZXMtaW8pIHRvIHZlcmlmeSBQbGFpZCB3ZWJob29rc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBKV0tQdWJsaWNLZXlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEpXS1B1YmxpY0tleSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbGcgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBhbGc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3J2IG1lbWJlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGN1cnZlIHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNydjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBraWQgKEtleSBJRCkgbWVtYmVyIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEgc3BlY2lmaWMga2V5LiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgaW5zdGFuY2UsIHRvIGNob29zZSBhbW9uZyBhIHNldCBvZiBrZXlzIHdpdGhpbiB0aGUgSldLIGR1cmluZyBrZXkgcm9sbG92ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGt0eSAoa2V5IHR5cGUpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBmYW1pbHkgdXNlZCB3aXRoIHRoZSBrZXksIHN1Y2ggYXMgUlNBIG9yIEVDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGt0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2UgKHB1YmxpYyBrZXkgdXNlKSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgaW50ZW5kZWQgdXNlIG9mIHRoZSBwdWJsaWMga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHVzZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB4IG1lbWJlciBjb250YWlucyB0aGUgeCBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgeSBtZW1iZXIgY29udGFpbnMgdGhlIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGVsbGlwdGljIGN1cnZlIHBvaW50LCBwcm92aWRlZCBhcyBhIGJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyBvZiB0aGUgY29vcmRpbmF0ZVxcJ3MgYmlnIGVuZGlhbiByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICB5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBrZXkgd2FzIGNyZWF0ZWQsIGluIFVuaXggdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBrZXkgZXhwaXJlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGV4cGlyZWRfYXQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgSldUIEhlYWRlciwgdXNlZCBmb3Igd2ViaG9vayB2YWxpZGF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXVEhlYWRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSldUSGVhZGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldUSGVhZGVyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgYWRkcmVzc2AgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UE9Cb3hTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBwb19ib3g6IFBPQm94U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzUHVycG9zZUxhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgZGF0ZV9vZl9iaXJ0aGAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGBreWNfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5reWNfY2hlY2tgIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBga3ljX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmt5Y19jaGVja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrQWRkcmVzc1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrTmFtZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IEtZQ0NoZWNrTmFtZVN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tJRE51bWJlclN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogS1lDQ2hlY2tJRE51bWJlclN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrUGhvbmVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEtZQ0NoZWNrUGhvbmVTdW1tYXJ5O1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBpZF9udW1iZXJgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0lETnVtYmVyU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYG5hbWVgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrTmFtZVN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tOYW1lU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYHBob25lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tQaG9uZVN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tQaG9uZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIGFyZWFfY29kZTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhdHlwZSB3YXMgYWNjZXNzZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXBwbGljYXRpb24gYWNjZXNzaW5nIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBhY2NvdW50X2JhbGFuY2VfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X2JhbGFuY2VfaW5mbzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfcm91dGluZ19udW1iZXIgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYWNjb3VudF9yb3V0aW5nX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGNvbnRhY3RfZGV0YWlscyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjb250YWN0X2RldGFpbHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbnMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY3JlZGl0X2FuZF9sb2FucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfYW5kX2xvYW5zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgaW52ZXN0bWVudHMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBwYXlyb2xsX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb25fcmlza19pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3Jpc2tfaW5mbzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgTElBQklMSVRJRVNgIGFuZCBjb2RlIGBERUZBVUxUX1VQREFURWAgd2lsbCBiZSBmaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGxpYWJpbGl0aWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhIGxpYWJpbGl0aWVzIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSUFCSUxJVElFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBcXCdzIGZvciBhY2NvdW50cyB0aGF0IGNvbnRhaW4gbmV3IGxpYWJpbGl0aWVzLlxcJ1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF9uZXdfbGlhYmlsaXRpZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGxpYWJpbGl0aWVzIGZpZWxkcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwicGFzdF9hbW91bnRfZHVlXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9saWFiaWxpdGllczogeyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvbGlhYmlsaXRpZXMvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgYG9wdGlvbnNgIGNhbm5vdCBiZSBudWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGxpYWJpbGl0eSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNPYmplY3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3JlZGl0IGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRDYXJkTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBjcmVkaXQ6IEFycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9ydGdhZ2UgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PE1vcnRnYWdlTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBtb3J0Z2FnZTogQXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3R1ZGVudCBsb2FuIGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTdHVkZW50TG9hbj59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgc3R1ZGVudDogQXJyYXk8U3R1ZGVudExvYW4+IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdHlPdmVycmlkZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBsaWFiaWxpdHkgb2JqZWN0LCBlaXRoZXIgYGNyZWRpdGAgb3IgYHN0dWRlbnRgLiBNb3J0Z2FnZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIHRoZSBjdXN0b20gU2FuZGJveC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyY2hhc2UgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIEZvciBzaW1wbGljaXR5LCB0aGlzIGlzIHRoZSBvbmx5IGludGVyZXN0IHJhdGUgdXNlZCB0byBjYWxjdWxhdGUgaW50ZXJlc3QgY2hhcmdlcy4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHB1cmNoYXNlX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjYXNoIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY2FzaF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFsYW5jZSB0cmFuc2ZlciBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGJhbGFuY2VfdHJhbnNmZXJfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpYWwgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzcGVjaWFsX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbGFzdF9wYXltZW50X2Ftb3VudGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBtaW5pbXVtX3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YCBvciBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19vdmVyZHVlYCBmaWVsZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgbG9hbiBwcmluY2lwYWwuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5vbWluYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnRlcmVzdCBjYXBpdGFsaXphdGlvbiBiZWdpbnMgYXQgdGhlIGdpdmVuIG51bWJlciBvZiBtb250aHMgYWZ0ZXIgbG9hbiBvcmlnaW5hdGlvbi4gQnkgZGVmYXVsdCBpbnRlcmVzdCBpcyBuZXZlciBjYXBpdGFsaXplZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9jYXBpdGFsaXphdGlvbl9ncmFjZV9wZXJpb2RfbW9udGhzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuUmVwYXltZW50TW9kZWx9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X21vZGVsOiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgZXhwZWN0ZWRfcGF5b2ZmX2RhdGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBndWFyYW50b3JgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgaXNfZmVkZXJhbGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX2ZlZGVyYWw6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsb2FuX25hbWVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBwYXltZW50X3JlZmVyZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBheW1lbnRfcmVmZXJlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBzbGZfc3RhdHVzOiBQU0xGU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4uZGVzY3JpcHRpb25gIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuX2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi50eXBlYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGBcXFwiZXh0ZW5kZWQgZ3JhZHVhdGVkXFxcImAsIGBcXFwiZXh0ZW5kZWQgc3RhbmRhcmRcXFwiYCwgYFxcXCJncmFkdWF0ZWRcXFwiYCwgYFxcXCJpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbmNvbWUtYmFzZWQgcmVwYXltZW50XFxcImAsIGBcXFwiaW50ZXJlc3Qgb25seVxcXCJgLCBgXFxcIm90aGVyXFxcImAsIGBcXFwicGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwicmV2aXNlZCBwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJzdGFuZGFyZFxcXCJgLCBvciBgXFxcInNhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvblxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgc2VxdWVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBBZGRyZXNzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0NhbGxiYWNrTWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBjYWxsYmFja190eXBlPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0V2ZW50TmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBldmVudF9uYW1lPzogTGlua0V2ZW50TmFtZTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlcmUgaW4gdGhlIGZsb3cgdGhlIExpbmsgdXNlciBleGl0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uPzogTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGFjY291bnRzIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFjY291bnQgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUFjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBJdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IExpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJZiBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBpcyBiZWluZyB1c2VkLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBiZWluZyB2ZXJpZmllZCBpcyBhIGBidXNpbmVzc2Agb3IgYHBlcnNvbmFsYCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rIGNvbnRhaW5pbmcgbWV0YWRhdGEgcHJveGllZCBvdmVyIGZyb20gTGluayBjYWxsYmFjayBlLmcgYG9uRXZlbnRgLCBgb25FeGl0YCwgYG9uU3VjY2Vzc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExJTktfQ0FMTEJBQ0tgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtDYWxsYmFja01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2NhbGxiYWNrX21ldGFkYXRhOiBMaW5rQ2FsbGJhY2tNZXRhZGF0YTtcbn1cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIGNvbnRhaW5pbmcgYm90aCB0aGUgdHlwZSBhbmQgYWRkcmVzcyB0byBzZW5kIHRoZSBVUkwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICAgICAqL1xuICAgIG1ldGhvZD86IExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgLyBlbWFpbCBhZGRyZXNzIHRoYXQgSG9zdGVkIExpbmsgc2Vzc2lvbnMgYXJlIGRlbGl2ZXJlZCB0by4gUGhvbmUgbnVtYmVycyBtdXN0IGJlIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gICAgICovXG4gICAgYWRkcmVzcz86IHN0cmluZztcbn1cbi8qKlxuICogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeU9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogTGlua0RlbGl2ZXJ5T3B0aW9ucztcbn1cbi8qKlxuICogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLCB3aGljaCB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgc3BlY2lmaWVkIGRlbGl2ZXJ5IG1ldGhvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi4gU2FtZSBhcyB0aGUgYGxpbmtfdG9rZW5gIHN0cmluZyBleGNsdWRpbmcgdGhlIFxcXCJsaW5rLXtlbnZ9LVxcXCIgcHJlZml4LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGVsaXZlcnkgbWV0aG9kIHRvIGJlIHVzZWQgdG8gZGVsaXZlciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiBVUkwuICBgU01TYDogVGhlIFVSTCB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoIFNNUyAgYEVNQUlMYDogVGhlIFVSTCB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoIGVtYWlsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ1NNUycsXG4gICAgRW1haWwgPSAnRU1BSUwnXG59XG5cbi8qKlxuICogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVNlc3Npb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNyZWF0ZWQgYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gSG9zdGVkIExpbmsgc2Vzc2lvbiB3YXMgY29tcGxldGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBcXCdXZWxscyBGYXJnb1xcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHJlbGF0ZWQgdG8gdGhlIGRlbGl2ZXJ5IG9mIHRoZSBsaW5rIHNlc3Npb24gdG8gdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeU1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICAgICAqL1xuICAgIGNvbW11bmljYXRpb25fbWV0aG9kPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkZWxpdmVyeV9zdGF0dXM/OiBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXM7XG59XG4vKipcbiAqIE9wdGlvbmFsIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVJlY2lwaWVudH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5T3B0aW9uc1xuICAgICAqL1xuICAgIHJlY2lwaWVudD86IExpbmtEZWxpdmVyeVJlY2lwaWVudDtcbn1cbi8qKlxuICogTWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgcmVjaXBpZW50LiBJZiB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gcG9wdWxhdGUgdGhpcyBmaWVsZCBpcyBub3QgYXZhaWxhYmxlLCBsZWF2ZSBpdCBibGFuay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5UmVjaXBpZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW11bmljYXRpb24gbWV0aG9kcyB0byBzZW5kIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTCB0by4gSWYgZGVsaXZlcnkgaXMgbm90IHJlcXVpcmVkLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5UmVjaXBpZW50XG4gICAgICovXG4gICAgY29tbXVuaWNhdGlvbl9tZXRob2RzPzogQXJyYXk8TGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZD47XG4gICAgLyoqXG4gICAgICogRmlyc3QgbmFtZSBvZiB0aGUgcmVjaXBpZW50LiBXaWxsIGJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsIC8gdGV4dCAoaWYgY29uZmlndXJlZCkuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uLiAgYENSRUFURURgOiBUaGUgc2Vzc2lvbiBpcyBjcmVhdGVkIGJ1dCBub3QgeWV0IGFjY2Vzc2VkIGJ5IHRoZSB1c2VyICBgT1BFTkVEYDogVGhlIHNlc3Npb24gaXMgb3BlbmVkIGJ5IHRoZSB1c2VyIGJ1dCBub3QgeWV0IGNvbXBsZXRlZCAgYEVYSVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGV4aXRlZCBieSB0aGUgdXNlciAgYENPTVBMRVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgdXNlciAgYEVYUElSRURgOiBUaGUgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cyB7XG4gICAgQ3JlYXRlZCA9ICdDUkVBVEVEJyxcbiAgICBPcGVuZWQgPSAnT1BFTkVEJyxcbiAgICBFeGl0ZWQgPSAnRVhJVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnQ09NUExFVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJ1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIExpbmsgY2FsbGJhY2sgZXZlbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGUge1xuICAgIFN1Y2Nlc3MgPSAnT05fU1VDQ0VTUycsXG4gICAgRXZlbnQgPSAnT05fRVZFTlQnLFxuICAgIEV4aXQgPSAnT05fRVhJVCdcbn1cblxuLyoqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBtZXRob2QgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgU21zID0gJ1NNUycsXG4gICAgRW1haWwgPSAnRU1BSUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZGVsaXZlcnkgb2YgdGhlIEhvc3RlZCBMaW5rIHRvIHRoZSB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVVUlEIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVkdXBsaWNhdGUgZXZlbnRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgYW4gZXZlbnQgdGhhdCBvY2N1cmVkIHdoaWxlIHRoZSB1c2VyIHdhcyBnb2luZyB0aHJvdWdoIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0V2ZW50TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieSBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBtZXNzYWdlIHRoYXQgdGhlIHVzZXIgZW5jb3VudGVyZWQuIEVtaXR0ZWQgYnk6IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHR5cGUgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIGtleSBpbmRpY2F0ZXMgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSB1c2VyIGV4aXRlZCB0aGUgTGluayBmbG93LiBFbWl0dGVkIGJ5OiBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBleGl0X3N0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHNlbGVjdGVkIGluc3RpdHV0aW9uLiBFbWl0dGVkIGJ5OiBhbGwgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGluc3RpdHV0aW9uLiBFbWl0dGVkIGJ5OiBhbGwgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdXNlZCB0byBzZWFyY2ggZm9yIGluc3RpdHV0aW9ucy4gRW1pdHRlZCBieTogYFNFQVJDSF9JTlNUSVRVVElPTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWFyY2hfcXVlcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgSUQgZm9yIHRoZSBsYXN0IHJlcXVlc3QgbWFkZSBieSBMaW5rLiBUaGlzIGNhbiBiZSBzaGFyZWQgd2l0aCBQbGFpZCBTdXBwb3J0IHRvIGV4cGVkaXRlIGludmVzdGlnYXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdXNlciBoYXMgZW5jb3VudGVyZWQgb25lIG9mIHRoZSBmb2xsb3dpbmcgTUZBIHR5cGVzOiBjb2RlLCBkZXZpY2UsIHF1ZXN0aW9ucywgc2VsZWN0aW9ucy4gRW1pdHRlZCBieTogYFNVQk1JVF9NRkFgIGFuZCBgVFJBTlNJVElPTl9WSUVXYCB3aGVuIHZpZXdfbmFtZSBpcyBgTUZBYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1mYV90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2aWV3IHRoYXQgaXMgYmVpbmcgdHJhbnNpdGlvbmVkIHRvLiBFbWl0dGVkIGJ5OiBgVFJBTlNJVElPTl9WSUVXYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHZpZXdfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgdGhlIHZlcmlmaWNhdGlvbiBtZXRob2QgZm9yIGEgbWF0Y2hlZCBpbnN0aXR1dGlvbiBzZWxlY3RlZCBieSB0aGUgdXNlciBvciB0aGUgQXV0aCBUeXBlIFNlbGVjdCBmbG93IHR5cGUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHNlbGVjdGVkIHZlcmlmaWNhdGlvbiBtZXRob2QsIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgcGhvbmVvdHBgIG9yIGBwYXNzd29yZGA7ICBpZiBzZWxlY3Rpb24gaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgc2VsZWN0ZWQgQXV0aCBUeXBlIFNlbGVjdCBmbG93LCB0aGVuIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGZsb3dfdHlwZV9tYW51YWxgIG9yIGBmbG93X3R5cGVfaW5zdGFudGAuIEVtaXR0ZWQgYnk6IGBNQVRDSEVEX1NFTEVDVF9WRVJJRllfTUVUSE9EYCBhbmQgYFNFTEVDVF9BVVRIX1RZUEVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgc2VsZWN0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBicmFuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGJyYW5kX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB0aGlzIGluc3RpdHV0aW9uIHdhcyBtYXRjaGVkLCB3aGljaCB3aWxsIGJlIGVpdGhlciBgcmV0dXJuaW5nX3VzZXJgIG9yIGByb3V0aW5nX251bWJlcmAuIEVtaXR0ZWQgYnk6IGBNQVRDSEVEX1NFTEVDVF9JTlNUSVRVVElPTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXRjaF9yZWFzb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIHN1Ym1pdHRlZCBieSB1c2VyIGF0IHRoZSBtaWNyby1kZXBvc2l0cyByb3V0aW5nIG51bWJlciBwYW5lLiBFbWl0dGVkIGJ5IGBTVUJNSVRfUk9VVElOR19OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG1hc2sgZXh0cmFjdGVkIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgYWNjb3VudCBudW1iZXIuIElmIHRoZSB1c2VyLWlucHV0dGVkIGFjY291bnQgbnVtYmVyIGlzIGZvdXIgZGlnaXRzIGxvbmcsIGBhY2NvdW50X251bWJlcl9tYXNrYCBpcyBlbXB0eS4gRW1pdHRlZCBieSBgU1VCTUlUX0FDQ09VTlRfTlVNQkVSYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyX21hc2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdGhhdCBoYXMganVzdCBvY2N1cnJlZCBpbiB0aGUgTGluayBmbG93LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0V2ZW50TmFtZSB7XG4gICAgQmFua0luY29tZUluc2lnaHRzQ29tcGxldGVkID0gJ0JBTktfSU5DT01FX0lOU0lHSFRTX0NPTVBMRVRFRCcsXG4gICAgQ2xvc2VPYXV0aCA9ICdDTE9TRV9PQVVUSCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIEV4aXQgPSAnRVhJVCcsXG4gICAgRmFpbE9hdXRoID0gJ0ZBSUxfT0FVVEgnLFxuICAgIEhhbmRvZmYgPSAnSEFORE9GRicsXG4gICAgT3BlbiA9ICdPUEVOJyxcbiAgICBPcGVuTXlQbGFpZCA9ICdPUEVOX01ZX1BMQUlEJyxcbiAgICBPcGVuT2F1dGggPSAnT1BFTl9PQVVUSCcsXG4gICAgU2VhcmNoSW5zdGl0dXRpb24gPSAnU0VBUkNIX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RBdXRoVHlwZSA9ICdTRUxFQ1RfQVVUSF9UWVBFJyxcbiAgICBTZWxlY3RCcmFuZCA9ICdTRUxFQ1RfQlJBTkQnLFxuICAgIFNlbGVjdERlZ3JhZGVkSW5zdGl0dXRpb24gPSAnU0VMRUNUX0RFR1JBREVEX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3REb3duSW5zdGl0dXRpb24gPSAnU0VMRUNUX0RPV05fSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEZpbHRlcmVkSW5zdGl0dXRpb24gPSAnU0VMRUNUX0ZJTFRFUkVEX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfSU5TVElUVVRJT04nLFxuICAgIFN1Ym1pdEFjY291bnROdW1iZXIgPSAnU1VCTUlUX0FDQ09VTlRfTlVNQkVSJyxcbiAgICBTdWJtaXRDcmVkZW50aWFscyA9ICdTVUJNSVRfQ1JFREVOVElBTFMnLFxuICAgIFN1Ym1pdERvY3VtZW50cyA9ICdTVUJNSVRfRE9DVU1FTlRTJyxcbiAgICBTdWJtaXREb2N1bWVudHNFcnJvciA9ICdTVUJNSVRfRE9DVU1FTlRTX0VSUk9SJyxcbiAgICBTdWJtaXREb2N1bWVudHNTdWNjZXNzID0gJ1NVQk1JVF9ET0NVTUVOVFNfU1VDQ0VTUycsXG4gICAgU3VibWl0TWZhID0gJ1NVQk1JVF9NRkEnLFxuICAgIFN1Ym1pdFJvdXRpbmdOdW1iZXIgPSAnU1VCTUlUX1JPVVRJTkdfTlVNQkVSJyxcbiAgICBUcmFuc2l0aW9uVmlldyA9ICdUUkFOU0lUSU9OX1ZJRVcnLFxuICAgIFZpZXdEYXRhVHlwZXMgPSAnVklFV19EQVRBX1RZUEVTJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGEgc3VtbWFyeSBvZiB0aGUgZXZlbnRzIGZyb20gYSBsaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0V2ZW50c1dlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudHNXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVZFTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgZXZlbnRzIGVtaXR0ZWQgZHVyaW5nIHRoZSBsaW5rIHNlc3Npb25cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua0V2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICBldmVudHM6IEFycmF5PExpbmtFdmVudD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBmb3IgdGhlIGxpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgb2NjdXJyZWQgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaW5rIHRva2VuIHVzZWQgdG8gY3JlYXRlIHRoZSBsaW5rIHNlc3Npb24gdGhlc2UgZXZlbnRzIGFyZSBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfY29ycmVsYXRpb25faWRgIGZyb20gYSByZWNlaXZlZCBPQXV0aCByZWRpcmVjdCBVUkkgY2FsbGJhY2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jb3JyZWxhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBsaW5rX3Rva2VuYCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBgbGlua19jb3JyZWxhdGlvbl9pZGAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlLWluaXRpYWxpemUgTGluay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uRXhpdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25leGl0KSBjYWxsYmFjayBmcm9tIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIERpc3BsYXllZCBpZiBhIHVzZXIgZXhpdHMgTGluayB3aXRob3V0IHN1Y2Nlc3NmdWxseSBsaW5raW5nIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCB3aWxsIGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgV2VsbHMgRmFyZ29gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24sIGFsb25nIHdpdGggdGhlIHB1YmxpYyB0b2tlbiBpZiBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBMSU5LYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNFU1NJT05fRklOSVNIRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmluYWwgc3RhdHVzIG9mIHRoZSBMaW5rIHNlc3Npb24uIFdpbGwgYWx3YXlzIGJlIFxcXCJTVUNDRVNTXFxcIiBvciBcXFwiRVhJVEVEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVibGljIHRva2VuIGdlbmVyYXRlZCBieSB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25TdWNjZXNzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbnN1Y2Nlc3MpIGNhbGxiYWNrIGZyb20gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIERpc3BsYXllZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc1xuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYGFjY291bnRzYCB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB1c2VyXFwncyBhY3Rpb25zIGFuZCBldmVudHMgdGhyb3VnaCB0aGUgTGluayBmbG93LiBJbmNsdWRlIHRoaXMgaWRlbnRpZmllciB3aGVuIG9wZW5pbmcgYSBzdXBwb3J0IHRpY2tldCBmb3IgZmFzdGVyIHR1cm5hcm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgdHJhbnNmZXJfc3RhdHVzPzogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgYWNjb3VudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBJdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIHN0YXR1cy4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSB0d28gYW1vdW50cy4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBOb3RlOiBEYXRhYmFzZSBNYXRjaCBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgYG51bGxgOiBtaWNyby1kZXBvc2l0LWJhc2VkIHZlcmlmaWNhdGlvbiBpcyBub3QgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGlzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IGJlaW5nIHZlcmlmaWVkIGlzIGEgYGJ1c2luZXNzYCBvciBgcGVyc29uYWxgIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgY2xhc3NfdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCB3aWxsIGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgXFwnV2VsbHMgRmFyZ29cXCdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSB0cmFuc2Zlci4gUmV0dXJuZWQgb25seSB3aGVuIFtUcmFuc2ZlciBVSV0oL2RvY3MvdHJhbnNmZXIvdXNpbmctdHJhbnNmZXItdWkpIGlzIGltcGxlbWVudGVkLiAgLSBgQ09NUExFVEVgIOKAkyBUaGUgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4gLSBgSU5DT01QTEVURWAg4oCTIFRoZSB0cmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBGb3IgaGVscCwgc2VlIFtUcm91Ymxlc2hvb3RpbmcgdHJhbnNmZXJzXSgvZG9jcy90cmFuc2Zlci91c2luZy10cmFuc2Zlci11aSN0cm91Ymxlc2hvb3RpbmctdHJhbnNmZXJzKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXMge1xuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJyxcbiAgICBJbmNvbXBsZXRlID0gJ0lOQ09NUExFVEUnXG59XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgTGluayB3aWxsIHByb3ZpZGUgbGltaXRlZCBhY2NvdW50IGZpbHRlcmluZzogaXQgd2lsbCBvbmx5IGRpc3BsYXkgSW5zdGl0dXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJvZHVjdHMgc3VwcGxpZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQsIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIHdpbGwgYWxzbyBmaWx0ZXIgb3V0IGFjY291bnRzIG90aGVyIHRoYW4gYGNoZWNraW5nYCBhbmQgYHNhdmluZ3NgIGFjY291bnRzIG9uIHRoZSBBY2NvdW50IFNlbGVjdCBwYW5lLiBZb3UgY2FuIGZ1cnRoZXIgbGltaXQgdGhlIGFjY291bnRzIHNob3duIGluIExpbmsgYnkgdXNpbmcgYGFjY291bnRfZmlsdGVyc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBzaG93biBpbiBMaW5rLiBPbmx5IHRoZSBzcGVjaWZpZWQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gVGhpcyBmaWx0ZXJpbmcgYXBwbGllcyB0byBib3RoIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3IChpZiBlbmFibGVkKSBhbmQgdGhlIEluc3RpdHV0aW9uIFNlbGVjdCB2aWV3LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgc2VsZWN0ZWQgc3VidHlwZXMgd2lsbCBiZSBvbWl0dGVkIGZyb20gTGluay4gVG8gaW5kaWNhdGUgdGhhdCBhbGwgc3VidHlwZXMgc2hvdWxkIGJlIHNob3duLCB1c2UgdGhlIHZhbHVlIGBcXFwiYWxsXFxcImAuIElmIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBmaWx0ZXIgaXMgdXNlZCwgYW55IGFjY291bnQgdHlwZSBmb3Igd2hpY2ggYSBmaWx0ZXIgaXMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGVudGlyZWx5IG9taXR0ZWQgZnJvbSBMaW5rLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBUaGUgZmlsdGVyIG1heSBvciBtYXkgbm90IGltcGFjdCB0aGUgbGlzdCBvZiBhY2NvdW50cyBzaG93biBieSB0aGUgaW5zdGl0dXRpb24gaW4gdGhlIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3csIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgaW5zdGl0dXRpb24uIElmIHRoZSB1c2VyIHNlbGVjdHMgZXhjbHVkZWQgYWNjb3VudCBzdWJ0eXBlcyBpbiB0aGUgT0F1dGggZmxvdywgdGhlc2UgYWNjb3VudHMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIEl0ZW0uIElmIHRoZSB1c2VyIHNlbGVjdHMgb25seSBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzLCB0aGUgbGluayBhdHRlbXB0IHdpbGwgZmFpbCBhbmQgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byB0cnkgYWdhaW4uIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQWNjb3VudEZpbHRlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBsb2FuPzogTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3RoZXJGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgb3RoZXI/OiBPdGhlckZpbHRlcjtcbn1cbi8qKlxuICogQSBtYXAgY29udGFpbmluZyBkYXRhIHRvIHBhc3MgaW4gZm9yIHRoZSBDYXJkIFN3aXRjaCBmbG93LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQklOIChCYW5rIElkZW50aWZpY2F0aW9uIE51bWJlcikgb2YgdGhlIGNhcmQgdG8gc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAgICAgKi9cbiAgICBjYXJkX2Jpbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEhvc3RlZCBMaW5rIChiZXRhKS4gT25seSBhdmFpbGFibGUgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgSG9zdGVkIExpbmsgYmV0YSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvc3RlZExpbmtEZWxpdmVyeU1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGRlbGl2ZXJ5X21ldGhvZD86IEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBVUkkgdGhhdCBIb3N0ZWQgTGluayB3aWxsIHJlZGlyZWN0IHRvIHVwb24gY29tcGxldGlvbiBvZiB0aGUgTGluayBmbG93LiBUaGlzIHdpbGwgb25seSBvY2N1ciBpbiBIb3N0ZWQgTGluayBzZXNzaW9ucywgbm90IGluIG90aGVyIGltcGxlbWVudGF0aW9uIG1ldGhvZHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3JlZGlyZWN0X3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBzZWNvbmRzIHRoZSBsaW5rIHdpbGwgYmUgdmFsaWQgZm9yLiBNdXN0IGJlIHBvc2l0aXZlLiBDYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMjEgZGF5cy4gVGhlIGRlZmF1bHQgbGlmZXRpbWUgaXMgNCBob3Vycy4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIHVybF9saWZldGltZV9zZWNvbmRzPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdXNlZCB0byBoaWdobGlnaHQgaW5zdGl0dXRpb25zIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGJhbmsgdG8gaGlnaGxpZ2h0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBsaWNhdGlvbiwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBMaW5rLiBNYXhpbXVtIGxlbmd0aCBvZiAzMCBjaGFyYWN0ZXJzLiBJZiBhIHZhbHVlIGxvbmdlciB0aGFuIDMwIGNoYXJhY3RlcnMgaXMgcHJvdmlkZWQsIExpbmsgd2lsbCBkaXNwbGF5IFxcXCJUaGlzIEFwcGxpY2F0aW9uXFxcIiBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYW5ndWFnZSB0aGF0IExpbmsgc2hvdWxkIGJlIGRpc3BsYXllZCBpbi4gV2hlbiBpbml0aWFsaXppbmcgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24sIHRoaXMgZmllbGQgaXMgbm90IHVzZWQ7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHN1cHBvcnRlZCBsYW5ndWFnZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi8jc3VwcG9ydGVkLWxhbmd1YWdlcykuICBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogLSBEYW5pc2ggKGBcXCdkYVxcJ2ApIC0gRHV0Y2ggKGBcXCdubFxcJ2ApIC0gRW5nbGlzaCAoYFxcJ2VuXFwnYCkgLSBFc3RvbmlhbiAoYFxcJ2V0XFwnYCkgLSBGcmVuY2ggKGBcXCdmclxcJ2ApIC0gR2VybWFuIChgXFwnZGVcXCdgKSAtIEl0YWxpYW4gKGBcXCdpdFxcJ2ApIC0gTGF0dmlhbiAoYFxcJ2x2XFwnYCkgLSBMaXRodWFuaWFuIChgXFwnbHRcXCdgKSAtIE5vcndlZ2lhbiAoYFxcJ25vXFwnYCkgLSBQb2xpc2ggKGBcXCdwbFxcJ2ApIC0gUG9ydHVndWVzZSAoYFxcJ3B0XFwnYCkgLSBSb21hbmlhbiAoYFxcJ3JvXFwnYCkgLSBTcGFuaXNoIChgXFwnZXNcXCdgKSAtIFN3ZWRpc2ggKGBcXCdzdlxcJ2ApICBXaGVuIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJlZCBoZXJlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmcgaW4gdGhlIGN1c3RvbWl6YXRpb24sIG9yIHRoZSBjdXN0b21pemF0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiBQbGFpZC1zdXBwb3J0ZWQgY291bnRyeSBjb2RlcyB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW5zdGl0dXRpb25zIGZyb20gYWxsIGxpc3RlZCBjb3VudHJpZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgY29tcGxldGUgbWFwcGluZyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMgYnkgY291bnRyeSwgc2VlIGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbC8uICBJZiB1c2luZyBJZGVudGl0eSBWZXJpZmljYXRpb24sIGBjb3VudHJ5X2NvZGVzYCBzaG91bGQgYmUgc2V0IHRvIHRoZSBjb3VudHJ5IHdoZXJlIHlvdXIgY29tcGFueSBpcyBiYXNlZCwgbm90IHRoZSBjb3VudHJ5IHdoZXJlIHlvdXIgdXNlciBpcyBsb2NhdGVkLiBGb3IgYWxsIG90aGVyIHByb2R1Y3RzLCBgY291bnRyeV9jb2Rlc2AgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgeW91ciB1c2VyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBJZiBMaW5rIGlzIGxhdW5jaGVkIHdpdGggbXVsdGlwbGUgY291bnRyeSBjb2Rlcywgb25seSBwcm9kdWN0cyB0aGF0IHlvdSBhcmUgZW5hYmxlZCBmb3IgaW4gYWxsIGNvdW50cmllcyB3aWxsIGJlIHVzZWQgYnkgTGluay4gTm90ZSB0aGF0IHdoaWxlIGFsbCBjb3VudHJpZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBpbiBTYW5kYm94IGFuZCBEZXZlbG9wbWVudCwgaW4gUHJvZHVjdGlvbiBvbmx5IFVTIGFuZCBDYW5hZGEgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gQWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucyByZXF1aXJlcyBhZGRpdGlvbmFsIGNvbXBsaWFuY2Ugc3RlcHMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucyBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiBJZiB5b3UgaW5pdGlhbGl6ZSB3aXRoIGEgRXVyb3BlYW4gY291bnRyeSBjb2RlLCB5b3VyIHVzZXJzIHdpbGwgc2VlIHRoZSBFdXJvcGVhbiBjb25zZW50IHBhbmVsIGR1cmluZyB0aGUgTGluayBmbG93LiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLCBvciB0aGUgY3VzdG9taXphdGlvbiBtYXkgbm90IGJlIGFwcGxpZWQuICBJZiB1c2luZyB0aGUgQXV0aCBmZWF0dXJlcyBJbnN0YW50IE1hdGNoLCBTYW1lLWRheSBNaWNyby1kZXBvc2l0cywgb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBgY291bnRyeV9jb2Rlc2AgbXVzdCBiZSBzZXQgdG8gYFtcXCdVU1xcJ11gLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXI7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZS4gSWYgbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHNob3VsZCBiZSBvbWl0dGVkICh1bmxlc3MgeW91IGFyZSB1c2luZyB1cGRhdGUgbW9kZSB0byBhZGQgSW5jb21lIG9yIEFzc2V0cyB0byBhbiBJdGVtKTsgcmVxdWlyZWQgb3RoZXJ3aXNlLiAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaXRpYWxpemVkIHdoZW4gYW55IG90aGVyIHByb2R1Y3QgaXMgaW5pdGlhbGl6ZWQuICBUaGUgcHJvZHVjdHMgc3BlY2lmaWVkIGhlcmUgd2lsbCBkZXRlcm1pbmUgd2hpY2ggaW5zdGl0dXRpb25zIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHlvdXIgdXNlcnMgaW4gTGluay4gT25seSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0ICphbGwqIHJlcXVlc3RlZCBwcm9kdWN0cyBjYW4gYmUgc2VsZWN0ZWQ7IGEgaWYgYSB1c2VyIGF0dGVtcHRzIHRvIHNlbGVjdCBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYSBsaXN0ZWQgcHJvZHVjdCwgYSBcXFwiQ29ubmVjdGl2aXR5IG5vdCBzdXBwb3J0ZWRcXFwiIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gTGluay4gVG8gbWF4aW1pemUgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYXZhaWxhYmxlLCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgbWluaW1hbCBwcm9kdWN0IHNldCByZXF1aXJlZCBmb3IgeW91ciB1c2UgY2FzZS4gQWRkaXRpb25hbCBwcm9kdWN0cyBjYW4gYmUgaW5jbHVkZWQgdmlhIHRoZSBbYG9wdGlvbmFsX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LW9wdGlvbmFsLXByb2R1Y3RzKSBvciAgW2ByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtcmVxdWlyZWQtaWYtc3VwcG9ydGVkLXByb2R1Y3RzKSBmaWVsZHMsIG9yIGNhbiBiZSBpbml0aWFsaXplZCBieSBjYWxsaW5nIHRoZSBlbmRwb2ludCBhZnRlciBvYnRhaW5pbmcgYW4gYWNjZXNzIHRva2VuLiBGb3IgZGV0YWlscyBhbmQgZXhjZXB0aW9ucywgc2VlIFtDaG9vc2luZyB3aGVuIHRvIGluaXRpYWxpemUgcHJvZHVjdHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvKS4gIE5vdGUgdGhhdCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIHRvIGRpc2FibGUgSW5zdGFudCBNYXRjaCBzdXBwb3J0LCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IEluc3RhbnQgTWF0Y2ggd2lsbCBhbHNvIGJlIHNob3duIGluIExpbmsgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGV2ZW4gdGhvdWdoIHRoZXNlIGluc3RpdHV0aW9ucyBkbyBub3QgY29udGFpbiBgYXV0aGAgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS4gIEluIFByb2R1Y3Rpb24sIHlvdSB3aWxsIGJlIGJpbGxlZCBmb3IgZWFjaCBwcm9kdWN0IHRoYXQgeW91IHNwZWNpZnkgd2hlbiBpbml0aWFsaXppbmcgTGluay4gTm90ZSB0aGF0IGEgcHJvZHVjdCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIGFuIEl0ZW0gb25jZSB0aGUgSXRlbSBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoYXQgcHJvZHVjdC4gVG8gc3RvcCBiaWxsaW5nIG9uIGFuIEl0ZW0gZm9yIHN1YnNjcmlwdGlvbi1iYXNlZCBwcm9kdWN0cywgc3VjaCBhcyBMaWFiaWxpdGllcywgSW52ZXN0bWVudHMsIGFuZCBUcmFuc2FjdGlvbnMsIHJlbW92ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gdXNlIG9ubHkgaWYgdGhlIGluc3RpdHV0aW9uIGFuZCBhY2NvdW50KHMpIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIHN1cHBvcnQgdGhlIHByb2R1Y3QuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gVGhlIHByb2R1Y3RzIHdpbGwgb25seSBiZSBleHRyYWN0ZWQgYW5kIGJpbGxlZCBpZiB0aGUgdXNlciBzZWxlY3RzIGFuIGluc3RpdHV0aW9uIGFuZCBhY2NvdW50IHR5cGUgdGhhdCBzdXBwb3J0cyB0aGVtLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW1JlcXVpcmVkIGlmIFN1cHBvcnRlZCBQcm9kdWN0c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHRoYXQgeW91IG1heSB3aXNoIHRvIHVzZSBidXQgdGhhdCBhcmUgbm90IHJlcXVpcmVkIGZvciB5b3VyIHVzZSBjYXNlLiBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gZmV0Y2ggZGF0YSBmb3IgdGhlc2UgcHJvZHVjdHMgb24gYSBiZXN0LWVmZm9ydCBiYXNpcywgYW5kIGZhaWx1cmUgdG8gc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIG5vdCBhZmZlY3QgSXRlbSBjcmVhdGlvbi4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5cy4gVGhlIGBwcm9kdWN0c2AgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiAgRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGlzIGZlYXR1cmUsIHNlZSBbT3B0aW9uYWwgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNvcHRpb25hbC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbmFsX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiAoQmV0YSkgVGhpcyBmaWVsZCBoYXMgbm8gZWZmZWN0IHVubGVzcyB5b3UgYXJlIHBhcnRpY2lwYXRpbmcgaW4gdGhlIFtEYXRhIFRyYW5zcGFyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpIGJldGEgcHJvZ3JhbS4gTGlzdCBvZiBhZGRpdGlvbmFsIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gY29sbGVjdCBjb25zZW50IGZvci4gVGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYmUgYmlsbGVkIHVudGlsIHlvdSBzdGFydCB1c2luZyB0aGVtIGJ5IGNhbGxpbmcgdGhlIHJlbGV2YW50IGVuZHBvaW50cy4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBoYXZlIGNvbnNlbnQgY29sbGVjdGVkLiAgSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiBMaW5rLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheXMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzdGluYXRpb24gVVJMIHRvIHdoaWNoIGFueSB3ZWJob29rcyBzaG91bGQgYmUgc2VudC4gTm90ZSB0aGF0IHdlYmhvb2tzIGZvciBQYXltZW50IEluaXRpYXRpb24gKGUtd2FsbGV0IHRyYW5zYWN0aW9ucyBvbmx5KSwgVHJhbnNmZXIsIEJhbmsgVHJhbnNmZXIgKGluY2x1ZGluZyBBdXRoIG1pY3JvLWRlcG9zaXQgbm90aWZpY2F0aW9uIHdlYmhvb2tzKSBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFyZSBjb25maWd1cmVkIHZpYSB0aGUgRGFzaGJvYXJkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSB0byB1cGRhdGUgb3IgcmVmZXJlbmNlLCB1c2VkIHdoZW4gdXBkYXRpbmcsIG1vZGlmeWluZywgb3IgYWNjZXNzaW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gLiBVc2VkIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHdoZW4gY29tcGxldGluZyB0aGUgU2FtZS1kYXkgKG1hbnVhbCkgTWljcm8tZGVwb3NpdCBmbG93LCBvciAob3B0aW9uYWxseSkgd2hlbiBpbml0aWFsaXppbmcgTGluayBmb3IgYSByZXR1cm5pbmcgdXNlciBhcyBwYXJ0IG9mIHRoZSBUcmFuc2ZlciBVSSBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2Nlc3MgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbXMgdG8gdXBkYXRlIGluIExpbmsgdXBkYXRlIG1vZGUgZm9yIHRoZSBBc3NldHMgcHJvZHVjdC4gVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIHRoZSBgYWNjZXNzX3Rva2VuYCBmaWVsZCBhbGxvd3MgdGhlIHVwZGF0aW5nIG9mIG11bHRpcGxlIGl0ZW1zIGF0IG9uY2UuIFRoaXMgZmVhdHVyZSBpcyBpbiBjbG9zZWQgYmV0YSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mby5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMaW5rIGN1c3RvbWl6YXRpb24gZnJvbSB0aGUgUGxhaWQgRGFzaGJvYXJkIHRvIGJlIGFwcGxpZWQgdG8gTGluay4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBkZWZhdWx0YCBjdXN0b21pemF0aW9uIHdpbGwgYmUgdXNlZC4gV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGluIHRoZSBjdXN0b21pemF0aW9uIG11c3QgbWF0Y2ggdGhlIGxhbmd1YWdlIHNlbGVjdGVkIHZpYSB0aGUgYGxhbmd1YWdlYCBwYXJhbWV0ZXIsIGFuZCB0aGUgY291bnRyaWVzIGluIHRoZSBjdXN0b21pemF0aW9uIHNob3VsZCBtYXRjaCB0aGUgY291bnRyeSBjb2RlcyBzZWxlY3RlZCB2aWEgYGNvdW50cnlfY29kZXNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2N1c3RvbWl6YXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSSSBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBhIHVzZXIgc2hvdWxkIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIHZpYSBhIHdlYnZpZXcuIFRoZSBgcmVkaXJlY3RfdXJpYCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50LCBtdXN0IGJlIGFuIGh0dHBzIFVSSS4gVG8gc3BlY2lmeSBhbnkgc3ViZG9tYWluLCB1c2UgYCpgIGFzIGEgd2lsZGNhcmQgY2hhcmFjdGVyLCBlLmcuIGBodHRwczovL18qLmV4YW1wbGUuY29tL29hdXRoLmh0bWxgLiBOb3RlIHRoYXQgYW55IHJlZGlyZWN0IFVSSSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgcmVkaXJlY3QgVVJJcyBsaXN0IGluIHRoZSBbZGV2ZWxvcGVyIGRhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKS4gSWYgaW5pdGlhbGl6aW5nIG9uIEFuZHJvaWQsIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgbXVzdCBiZSBzcGVjaWZpZWQgaW5zdGVhZCBhbmQgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIGJlIGxlZnQgYmxhbmsuIElmIHVzaW5nIEhvc3RlZCBMaW5rIChiZXRhKSB0aGUgYHJlZGlyZWN0X3VyaWAgbXVzdCBiZSBzZXQgdG8gYGh0dHBzOi8vaG9zdGVkLnBsYWlkLmNvbS9vYXV0aC9yZWRpcmVjdGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcFxcJ3MgQW5kcm9pZCBwYWNrYWdlLiBSZXF1aXJlZCBpZiB1c2luZyB0aGUgYGxpbmtfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBvbiBBbmRyb2lkLiBBbnkgcGFja2FnZSBuYW1lIHNwZWNpZmllZCBoZXJlIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCBBbmRyb2lkIHBhY2thZ2UgbmFtZXMgc2V0dGluZyBvbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIFdoZW4gY3JlYXRpbmcgYSBgbGlua190b2tlbmAgZm9yIGluaXRpYWxpemluZyBMaW5rIG9uIG90aGVyIHBsYXRmb3JtcywgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIGxlZnQgYmxhbmsgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFuZHJvaWRfcGFja2FnZV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9kYXRhPzogTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2FyZF9zd2l0Y2g/OiBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5BY2NvdW50RmlsdGVyc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IExpbmtUb2tlbkFjY291bnRGaWx0ZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5FVUNvbmZpZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV1X2NvbmZpZz86IExpbmtUb2tlbkVVQ29uZmlnO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGNlcnRhaW4gRXVyb3BlLW9ubHkgY29uZmlndXJhdGlvbnMsIGFzIHdlbGwgYXMgY2VydGFpbiBsZWdhY3kgdXNlIGNhc2VzIGluIG90aGVyIHJlZ2lvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2g/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlPzogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVwZGF0ZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHM7XG4gICAgLyoqXG4gICAgICogQSB1c2VyIHRva2VuIGdlbmVyYXRlZCB1c2luZyBgL3VzZXIvY3JlYXRlYC4gQW55IEl0ZW0gY3JlYXRlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IExpbmtUb2tlbkludmVzdG1lbnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGh9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50c19hdXRoPzogTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaG9zdGVkX2xpbms/OiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5UcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBMaW5rVG9rZW5UcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCByZXF1ZXN0IGEgQ1JBIGNvbm5lY3Rpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmFfZW5hYmxlZD86IGJvb2xlYW47XG59XG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBvbmx5IGRpc3BsYXkgYWNjb3VudCB0eXBlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gWW91IGNhbiBmdXJ0aGVyIGxpbWl0IHRoZSBhY2NvdW50cyBzaG93biBpbiBMaW5rIGJ5IHVzaW5nIGBhY2NvdW50X2ZpbHRlcnNgIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgc3VidHlwZXMgdG8gYmUgc2hvd24gaW4gTGluay4gT25seSB0aGUgc3BlY2lmaWVkIHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIFRoaXMgZmlsdGVyaW5nIGFwcGxpZXMgdG8gYm90aCB0aGUgQWNjb3VudCBTZWxlY3QgdmlldyAoaWYgZW5hYmxlZCkgYW5kIHRoZSBJbnN0aXR1dGlvbiBTZWxlY3Qgdmlldy4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNlbGVjdGVkIHN1YnR5cGVzIHdpbGwgYmUgb21pdHRlZCBmcm9tIExpbmsuIFRvIGluZGljYXRlIHRoYXQgYWxsIHN1YnR5cGVzIHNob3VsZCBiZSBzaG93biwgdXNlIHRoZSB2YWx1ZSBgXFxcImFsbFxcXCJgLiBJZiB0aGUgYGFjY291bnRfZmlsdGVyc2AgZmlsdGVyIGlzIHVzZWQsIGFueSBhY2NvdW50IHR5cGUgZm9yIHdoaWNoIGEgZmlsdGVyIGlzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBlbnRpcmVseSBvbWl0dGVkIGZyb20gTGluay4gIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIEZvciBpbnN0aXR1dGlvbnMgdXNpbmcgT0F1dGgsIHRoZSBmaWx0ZXIgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0IG9mIGluc3RpdHV0aW9ucyBvciBhY2NvdW50cyBzaG93biBieSB0aGUgYmFuayBpbiB0aGUgT0F1dGggd2luZG93LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgY3JlZGl0PzogTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgbG9hbj86IExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQXV0aCBwcm9kdWN0LiBUaGlzIGZpZWxkIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIGV4dGVuZGVkIEF1dGggZmxvd3MgZm9yIHRoZSByZXN1bHRpbmcgTGluayBzZXNzaW9uLiBPbWl0dGluZyBhbnkgZmllbGQgd2lsbCByZXN1bHQgaW4gYSBkZWZhdWx0IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aCB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgQXV0aCBUeXBlIFNlbGVjdCBpcyBlbmFibGVkIGZvciB0aGUgTGluayBzZXNzaW9uLCBhbGxvd2luZyB0aGUgZW5kIHVzZXIgdG8gY2hvb3NlIGJldHdlZW4gbGlua2luZyBpbnN0YW50bHkgb3IgbWFudWFsbHkgcHJpb3IgdG8gc2VsZWN0aW5nIHRoZWlyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSBpZiBgc2FtZV9kYXlfbWljcm9kZXBvc2l0c19lbmFibGVkYCBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBhdXRoX3R5cGVfc2VsZWN0X2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGF1dG9tYXRlZF9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWF0Y2ggZmxvdy4gQXMgb2YgTm92ZW1iZXIgMjAyMiwgSW5zdGFudCBNYXRjaCB3aWxsIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gSW5zdGFudCBNYXRjaCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzIGZpZWxkIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgaW5zdGFudF9tYXRjaF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHNhbWVfZGF5X21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgSW5zdGFudCBNaWNyby1kZXBvc2l0cyBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hhdCB0eXBlIG9mIFtSZXJvdXRlIHRvIENyZWRlbnRpYWxzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2Uvc2FtZS1kYXkvI3Jlcm91dGUtdG8tY3JlZGVudGlhbHMpIHBhbmUgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3cuIEFzIG9mIE9jdG9iZXIgMTUgMjAyMywgdGhlIGRlZmF1bHQgc2V0dGluZyBpcyBgT1BUSU9OQUxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgcmVyb3V0ZV90b19jcmVkZW50aWFscz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIERhdGFiYXNlIE1hdGNoIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgZGF0YWJhc2VfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBhdXRoX3R5cGVfc2VsZWN0X2VuYWJsZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmbG93X3R5cGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bSB7XG4gICAgT2ZmID0gJ09GRicsXG4gICAgT3B0aW9uYWwgPSAnT1BUSU9OQUwnLFxuICAgIEZvcmNlZCA9ICdGT1JDRUQnXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtIHtcbiAgICBGbGV4aWJsZUF1dGggPSAnRkxFWElCTEVfQVVUSCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBCYXNlIFJlcG9ydCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBhc3NldHNgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCB0aGUgY2xpZW50IGlzIENSQS1lbmFibGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIERlcG9zaXQgU3dpdGNoIChiZXRhKSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBkZXBvc2l0X3N3aXRjaGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaCB7XG4gICAgLyoqXG4gICAgICogVGhlIGBkZXBvc2l0X3N3aXRjaF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEVtcGxveW1lbnQgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZW1wbG95bWVudGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBlbXBsb3ltZW50IGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X3NvdXJjZV90eXBlcz86IEFycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZTtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEVtcGxveW1lbnQuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCBgYmFua2AgaXMgc3BlY2lmaWVkIGluIGBlbXBsb3ltZW50X3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgQmFuayBFbXBsb3ltZW50IHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbiBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGFncmVlZCB0byBhIHByaXZhY3kgcG9saWN5IHNwZWNpZnlpbmcgdGhhdCB0aGVpciBkYXRhIHdpbGwgYmUgc2hhcmVkIHdpdGggUGxhaWQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIElmIGBnYXZlX2NvbnNlbnRgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCB3aWxsIGJlIG1hcmtlZCBhcyBgc2tpcHBlZGAgYW5kIHRoZSBlbmQgdXNlclxcJ3Mgc2Vzc2lvbiB3aWxsIHN0YXJ0IGF0IHRoZSBuZXh0IHN0ZXAgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGdhdmVfY29uc2VudD86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEluY29tZSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCBvZiB0aGUgdmVyaWZpY2F0aW9uIGluc3RhbmNlLCBhcyBwcm92aWRlZCBieSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X2lkYCBvZiBhbiBhc3NldCByZXBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLCBhcyBwcm92aWRlZCBieSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBQcm92aWRpbmcgYW4gYGFzc2V0X3JlcG9ydF9pZGAgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgdXNlciB0aHJvdWdoIGEgc3RyZWFtbGluZWQgZmxvdy4gSWYgcHJvdmlkZWQsIHRoZSBiYW5rIGxpbmtpbmcgZmxvdyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gSXRlbXMgdGhhdCBhIHVzZXIgaGFzIHByZXZpb3VzbHkgY29ubmVjdGVkIHdpdGguIERhdGEgZnJvbSB0aGVzZSBpbnN0aXR1dGlvbnMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggZG9jdW1lbnQgZGF0YSByZWNlaXZlZCBkdXJpbmcgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGhlbHAgdmVyaWZ5IHRoYXQgdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBhcmUgYWNjdXJhdGUuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBwcm9kdWN0IHdhcyBub3QgaW5pdGlhbGl6ZWQgZm9yIHRoZXNlIEl0ZW1zIGR1cmluZyBsaW5rLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIHRoaXMgTGluayBzZXNzaW9uLiAgVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdGhlIGBwYXlyb2xsYCBpbmNvbWUgc291cmNlIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX3R5cGVzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwYXlyb2xsX2luY29tZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB1c2VyIHN0YXRlZCBpbmNvbWUgc291cmNlc1xuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0ZWRfaW5jb21lX3NvdXJjZXM/OiBBcnJheTxMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZT47XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggQmFuayBJbmNvbWUuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGluY29tZV92ZXJpZmljYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCBgYmFua2AgaXMgc3BlY2lmaWVkIGluIGBpbmNvbWVfc291cmNlX3R5cGVzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgQmFuayBJbmNvbWUgcHJvZHVjdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBtdWx0aXBsZSBJdGVtcyB0byBiZSBhZGRlZCBpbiB0aGUgTGluayBzZXNzaW9uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICovXG4gICAgZW5hYmxlX211bHRpcGxlX2l0ZW1zPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGF5cm9sbCBJbmNvbWUgKGluY2x1ZGluZyBEb2N1bWVudCBJbmNvbWUpLiBGdXJ0aGVyIGN1c3RvbWl6YXRpb24gb3B0aW9ucyBmb3IgRG9jdW1lbnQgSW5jb21lLCBzdWNoIGFzIGN1c3RvbWl6aW5nIHdoaWNoIGRvY3VtZW50IHR5cGVzIG1heSBiZSB1cGxvYWRlZCwgYXJlIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgW0xpbmsgQ3VzdG9taXphdGlvbiBwYW5lXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vbGluaykgaW4gdGhlIERhc2hib2FyZC4gKFJlcXVpcmVzIFByb2R1Y3Rpb24gZW5hYmxlbWVudC4pXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiB0byBlbmFibGUgZm9yIHRoZSBMaW5rIHNlc3Npb24uIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlbiB1c2VycyB3aWxsIHNlZSBib3RoIGRvY3VtZW50IGFuZCBkaWdpdGFsIHBheXJvbGwgaW5jb21lLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGZsb3dfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gTGluayB0b2tlbiB3aWxsIGJlIHVzZWQgZm9yIHVwZGF0ZSBtb2RlLiBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGlzX3VwZGF0ZV9tb2RlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBVbmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIEl0ZW0gdG8gdXBkYXRlIHdpdGguICBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gICAgICovXG4gICAgaXRlbV9pZF90b191cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBhbmFseXNpcyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHVwbG9hZHMuIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCB0aGVuIGRvY3Mgd2lsbCB1bmRlcmdvIE9DUiBwYXJzaW5nIG9ubHkuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlnPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgcGF5bWVudF9pbml0aWF0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS4gRWl0aGVyIGBwYXltZW50X2lkYCBvciBgY29uc2VudF9pZGAgbXVzdCBiZSBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY29uc2VudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBTdGF0ZW1lbnRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIwLTEwLTMwXFxcIi4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDMgbW9udGhzIHByaW9yIHRvIHRoZSBjdXJyZW50IGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkg4oCcWVlZWS1NTS1EROKAnSBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGF0ZS4gWW91IGNhbiByZXF1ZXN0IHVwIHRvIHR3byB5ZWFycyBvZiBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFRyYW5zZmVyIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCByZXR1cm5lZCBieSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBpbnRlbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHJldHVybmVkIGJ5IHRoZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGUge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgZW5hYmxlcyBbdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLyN1c2luZy11cGRhdGUtbW9kZS10by1yZXF1ZXN0LW5ldy1hY2NvdW50cykgZm9yIGluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCB1c2UgT0F1dGgsIG9yIHRoYXQgdXNlIE9BdXRoIGJ1dCBkbyBub3QgaGF2ZSB0aGVpciBvd24gYWNjb3VudCBzZWxlY3Rpb24gZmxvdy4gRm9yIGluc3RpdHV0aW9ucyB0aGF0IGhhdmUgYW4gT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdyAoaS5lLiBtb3N0IE9BdXRoLWVuYWJsZWQgaW5zdGl0dXRpb25zKSwgdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgYWNjb3VudF9zZWxlY3Rpb25fZW5hYmxlZD86IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlciB3aG8gd2lsbCBiZSBsaW5raW5nIHRoZWlyIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgcmVwcmVzZW50aW5nIHRoZSBlbmQgdXNlci4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSBhIHVzZXIgSUQgbnVtYmVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC4gSXQgaXMgY3VycmVudGx5IHVzZWQgYXMgYSBtZWFucyBvZiBzZWFyY2hpbmcgbG9ncyBmb3IgdGhlIGdpdmVuIHVzZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZSwgdXNlZCBmb3IgW21pY3JvLWRlcG9zaXQgYmFzZWQgdmVyaWZpY2F0aW9uIGZsb3dzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS4gRm9yIGEgc21hbGwgbnVtYmVyIG9mIGN1c3RvbWVycyBvbiBsZWdhY3kgZmxvd3MsIHByb3ZpZGluZyB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBtaWNyby1kZXBvc2l0LWJhc2VkIGZsb3dzLiBGb3IgYWxsIG90aGVyIGN1c3RvbWVycywgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHByb3ZpZGluZyB0aGUgdXNlclxcJ3MgbmFtZSBpbiB0aGlzIGZpZWxkIHdoZW4gdXNpbmcgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gd2lsbCBlbmFibGUgY2VydGFpbiByaXNrIGNoZWNrcyBhbmQgY2FuIHJlZHVjZSBtaWNyby1kZXBvc2l0IGZyYXVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIgaW4gW0UuMTY0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FLjE2NCkgZm9ybWF0LiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLCBidXQgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gQ2FuIGFsc28gYmUgdXNlZCB0byBwcmVmaWxsIExpbmsgZmllbGRzIHdoZW4gdXNlZCB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgcGhvbmUgbnVtYmVyIHdhcyB2ZXJpZmllZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGlzIHdhcyBwcmV2aW91c2x5IGFuIG9wdGlvbmFsIGZpZWxkIHVzZWQgaW4gdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLiBUaGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBlbmFibGUgdGhlIHJldHVybmluZyB1c2VyIGV4cGVyaWVuY2UuICAgT25seSBwYXNzIGEgdmVyaWZpY2F0aW9uIHRpbWUgZm9yIGEgcGhvbmUgbnVtYmVyIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvbuKAmXQgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcl92ZXJpZmllZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgW3ByZS1hdXRoZW50aWNhdGVkIHJldHVybmluZyB1c2VyIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlci8jcHJlLWF1dGhlbnRpY2F0ZWQtcnV4KS4gQ2FuIGFsc28gYmUgdXNlZCB0byBwcmVmaWxsIExpbmsgZmllbGRzIHdoZW4gdXNlZCB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIGVtYWlsIGFkZHJlc3Mgd2FzIHZlcmlmaWVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUaGg6bW06c3NaYCkuIFRoaXMgd2FzIHByZXZpb3VzbHkgYW4gb3B0aW9uYWwgZmllbGQgdXNlZCBpbiB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZS4gICBPbmx5IHBhc3MgYSB2ZXJpZmljYXRpb24gdGltZSBmb3IgYW4gZW1haWwgYWRkcmVzcyB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3NfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBhbmQgbm90IGN1cnJlbnRseSB1c2VkLCB1c2UgdGhlIGBpZF9udW1iZXJgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUbyBiZSBwcm92aWRlZCBpbiB0aGUgZm9ybWF0IFxcXCJ5eXl5LW1tLWRkXFxcIi4gQ2FuIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXMgZm9yIHRoZSBJbmNvbWUgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBjb3JyZXNwb25kaW5nIHRvIGFuIGluY29tZSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgcGVyIGN5Y2xlIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfcGVyX2N5Y2xlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgYW5udWFsbHkgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9hbm51YWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV90eXBlPzogVXNlclN0YXRlZEluY29tZVNvdXJjZVBheVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3k7XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBsaW5rX3Rva2VuYCBjcmVhdGVkIHRvIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgdGhhdCB3aWxsIGJlIGV4Y2hhbmdlZCBmb3IgYSBuZXcgYGFjY2Vzc190b2tlbmAgZXhwaXJlcyBhZnRlciA0IGhvdXJzLiBBIGBsaW5rX3Rva2VuYCBjcmVhdGVkIGZvciBhbiBleGlzdGluZyBJdGVtIChzdWNoIGFzIHdoZW4gdXBkYXRpbmcgYW4gZXhpc3RpbmcgYGFjY2Vzc190b2tlbmAgYnkgbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUpIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkwgb2YgYSBQbGFpZC1ob3N0ZWQgTGluayBmbG93IHRoYXQgd2lsbCB1c2UgdGhlIExpbmsgdG9rZW4gcmV0dXJuZWQgYnkgdGhpcyByZXF1ZXN0LiBPbmx5IHByZXNlbnQgaWYgdGhlIGNsaWVudCBpcyBlbmFibGVkIGZvciBIb3N0ZWQgTGluayAoYmV0YSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBob3N0ZWRfbGlua191cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgRVUgZmxvd3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIG9wZW4gTGluayB3aXRob3V0IGFuIGluaXRpYWwgVUkuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkVVQ29uZmlnXG4gICAgICovXG4gICAgaGVhZGxlc3M/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgYXJndW1lbnRzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2R1Y3RzYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGluaXRpYWxfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHdlYmhvb2tgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvdW50cnlfY29kZXNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgbGFuZ3VhZ2VgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2RhdGE/OiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRGaWx0ZXJzUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVkaXJlY3RfdXJpYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9uYW1lYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IExpbmsgc2Vzc2lvbnMgY3JlYXRlZCB1c2luZyB0aGlzIGBsaW5rX3Rva2VuYC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgcHJlc2VudCBpZiB5b3VyIGNsaWVudCBpcyBlbmFibGVkIGZvciBIb3N0ZWQgTGluayAoYmV0YSkuIFNlc3Npb24gZGF0YSB3aWxsIGJlIHByb3ZpZGVkIGZvciB1cCB0byBzaXggaG91cnMgYWZ0ZXIgdGhlIHNlc3Npb24gaGFzIGVuZGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25zPzogQXJyYXk8TGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGxpbmsgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgcHJlc2VudCBpZiB5b3VyIGNsaWVudCBpcyBlbmFibGVkIGZvciBIb3N0ZWQgTGluayAoYmV0YSkuIFNlc3Npb24gZGF0YSB3aWxsIGJlIHByb3ZpZGVkIGZvciB1cCB0byBzaXggaG91cnMgYWZ0ZXIgdGhlIHNlc3Npb24gaGFzIGVuZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIGxpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgbGluayBzZXNzaW9uIHdhcyBmaXJzdCBzdGFydGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXJ0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgbGluayBzZXNzaW9uIHdhcyBmaW5pc2hlZCwgaWYgYXZhaWxhYmxlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGZpbmlzaGVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgb25fc3VjY2Vzcz86IExpbmtTZXNzaW9uU3VjY2VzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIG9uX2V4aXQ/OiBMaW5rU2Vzc2lvbkV4aXQgfCBudWxsO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyBzZWxmLWN1c3RvZHkgY3J5cHRvIHdhbGxldHMgdG8gYmUgYWRkZWQgd2l0aG91dCByZXF1aXJpbmcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd191bnZlcmlmaWVkX2NyeXB0b193YWxsZXRzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGVudGVyIEludmVzdG1lbnRzIGFjY291bnQgYW5kIGhvbGRpbmdzIGluZm9ybWF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X21hbnVhbF9lbnRyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIEF1dGggUHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aCB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgbWFudWFsIGVudHJ5IGZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIG1hbnVhbF9lbnRyeV9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgbWFza2VkIG51bWJlciBtYXRjaCBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYXNrZWRfbnVtYmVyX21hdGNoX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5UcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBGb3IgZGV2ZWxvcGVyIGFjY291bnRzIGNyZWF0ZWQgYWZ0ZXIgRGVjZW1iZXIgMywgMjAyMywgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA5MCBkYXlzLiBGb3IgZGV2ZWxvcGVyIGFjY291bnRzIGNyZWF0ZWQgb24gRGVjZW1iZXIgMywgMjAyMyBvciBlYXJsaWVyLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDczMCBkYXlzIHVudGlsIEp1bmUgMjQsIDIwMjQsIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgZGVmYXVsdCB0byA5MCBkYXlzLiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgY3VzdG9tZXJzIHV0aWxpemluZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBXZWJob29rIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiB0byBhIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVMSVZFUllfU1RBVFVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X21ldGFkYXRhOiBMaW5rRGVsaXZlcnlNZXRhZGF0YTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBtb3J0Z2FnZSBsb2FuIGFncmVlbWVudCBiZXR3ZWVuIG9uZSBvciBtb3JlIGJvcnJvd2VycyBhbmQgYSBtb3J0Z2FnZSBsZW5kZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogTG9hbklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBsb2FuIGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtbG9hbikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuQWNjb3VudFN1YnR5cGUge1xuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuRmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMb2FuRmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBUaGUgaW5mb3JtYXRpb24gdXNlZCB0byBpZGVudGlmeSB0aGlzIGxvYW4gYnkgdmFyaW91cyBwYXJ0aWVzIHRvIHRoZSB0cmFuc2FjdGlvbiBvciBvdGhlciBvcmdhbml6YXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuSWRlbnRpZmllclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllclxuICAgICAqL1xuICAgIExvYW5JZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllclR5cGV9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyXG4gICAgICovXG4gICAgTG9hbklkZW50aWZpZXJUeXBlOiBMb2FuSWRlbnRpZmllclR5cGUgfCBudWxsO1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgbG9hbiBpZGVudGlmaWVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTG9hbklkZW50aWZpZXJUeXBlIHtcbiAgICBMZW5kZXJMb2FuID0gJ0xlbmRlckxvYW4nLFxuICAgIFVuaXZlcnNhbExvYW4gPSAnVW5pdmVyc2FsTG9hbidcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGN1cnJlbnQgYW5kIHByZXZpb3VzIGlkZW50aWZpZXJzIGZvciB0aGlzIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllcnNcbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVI6IExvYW5JZGVudGlmaWVyO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbG9hbnMgdGhhdCBhcmUgcGFydCBvZiBhIHNpbmdsZSBkZWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2Fuc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbnNcbiAgICAgKi9cbiAgICBMT0FOOiBMb2FuO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2NhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRpdHVkZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBsYXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxvbmdpdHVkZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBsb246IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IGRlZmluZWQgc3RvcmUgbnVtYmVyIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHN0b3JlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBtdWx0aS1mYWN0b3IgYXV0aGVudGljYXRpb24gc2V0dGluZ3MgdG8gdXNlIHdpdGggdGhpcyB0ZXN0IGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTUZBXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNRkEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBkZXZpY2VgLCBgc2VsZWN0aW9uc2AsIG9yIGBxdWVzdGlvbnNgLiAgSWYgdmFsdWUgaXMgYGRldmljZWAsIHRoZSBNRkEgYW5zd2VyIGlzIGAxMjM0YC4gIElmIHZhbHVlIGlzIGBzZWxlY3Rpb25zYCwgdGhlIE1GQSBhbnN3ZXIgaXMgYWx3YXlzIHRoZSBmaXJzdCBvcHRpb24uICBJZiB2YWx1ZSBpcyBgcXVlc3Rpb25zYCwgdGhlIE1GQSBhbnN3ZXIgaXMgIGBhbnN3ZXJfPGk+XzxqPmAgZm9yIHRoZSBqLXRoIHF1ZXN0aW9uIGluIHRoZSBpLXRoIHJvdW5kLCBzdGFydGluZyBmcm9tIDAuIEZvciBleGFtcGxlLCB0aGUgYW5zd2VyIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiBpbiB0aGUgc2Vjb25kIHJvdW5kIGlzIGBhbnN3ZXJfMV8wYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHJvdW5kcyBvZiBxdWVzdGlvbnMuIFJlcXVpcmVkIGlmIHZhbHVlIG9mIGB0eXBlYCBpcyBgcXVlc3Rpb25zYC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25fcm91bmRzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHF1ZXN0aW9ucyBwZXIgcm91bmQuIFJlcXVpcmVkIGlmIHZhbHVlIG9mIGB0eXBlYCBpcyBgcXVlc3Rpb25zYC4gSWYgdmFsdWUgb2YgdHlwZSBpcyBgc2VsZWN0aW9uc2AsIGRlZmF1bHQgdmFsdWUgaXMgMi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBxdWVzdGlvbnNfcGVyX3JvdW5kOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHJvdW5kcyBvZiBzZWxlY3Rpb25zLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uc2AuIERlZmF1bHRzIHRvIDEuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBhdmFpbGFibGUgYW5zd2VycyBwZXIgcXVlc3Rpb24sIHVzZWQgaWYgYHR5cGVgIGlzIGBzZWxlY3Rpb25gLiBEZWZhdWx0cyB0byAyLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25zX3Blcl9xdWVzdGlvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBTdW1tYXJ5IG9iamVjdCByZWZsZWN0aW5nIHRoZSBtYXRjaCByZXN1bHQgb2YgdGhlIGFzc29jaWF0ZWQgZGF0YVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNYXRjaFN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBNYXRjaFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIG1hdGNoIHR5cGUgYmV0d2VlbiBkYXRhIHByb3ZpZGVkIGJ5IHVzZXIgYW5kIGRhdGEgY2hlY2tlZCBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlLiAgIGBtYXRjaGAgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEgd2FzIGEgc3Ryb25nIG1hdGNoIGFnYWluc3QgZXh0ZXJuYWwgZGF0YS4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIGFnYWluc3QgZXh0ZXJuYWwgZGF0YS4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gcGVyZm9ybSBhIGNoZWNrIGFnYWluc3QgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYW5kIGl0IGRpZCBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBmaW5kIGV4dGVybmFsIGRhdGEgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2lucHV0YCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgdW5hYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBiZWNhdXNlIG5vIGluZm9ybWF0aW9uIHdhcyBwcm92aWRlZCBmb3IgdGhpcyBmaWVsZCBieSB0aGUgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNYXRjaFN1bW1hcnlDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIEluc2lnaHRzIGludG8gYSB1c2Vy4oCZcyB0b3AgbWVyY2hhbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNZXJjaGFudEluc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNZXJjaGFudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBtZXJjaGFudCBvZiB0aGlzIHR5cGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9wcmltYXJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRhaWxlZCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIEFsbG93cyBzcGVjaWZ5aW5nIHRoZSBtZXRhZGF0YSBvZiB0aGUgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1ldGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE1ldGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG9mZmljaWFsIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBsaW1pdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBtYXNrLiBTaG91bGQgYmUgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nIG9mIDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gVGhpcyBhbGxvd3MgeW91IHRvIG1vZGVsIGEgbWFzayB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgKHN1Y2ggYXMgd2l0aCBhIHZpcnR1YWwgYWNjb3VudCBudW1iZXIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSBpbnRlcmVzdCByYXRlIGZvciB0aGUgbW9ydGdhZ2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBlcmNlbnRhZ2UgdmFsdWUgKGludGVyZXN0IHJhdGUgb2YgY3VycmVudCBtb3J0Z2FnZSwgbm90IEFQUikgb2YgaW50ZXJlc3QgcGF5YWJsZSBvbiBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGludGVyZXN0IGNoYXJnZWQgKGZpeGVkIG9yIHZhcmlhYmxlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBtb3J0Z2FnZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgb3V0c3RhbmRpbmcgYW1vdW50IGNoYXJnZWQgZm9yIGxhdGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGN1cnJlbnRfbGF0ZV9mZWU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IGhlbGQgaW4gZXNjcm93IHRvIHBheSB0YXhlcyBhbmQgaW5zdXJhbmNlIG9uIGJlaGFsZiBvZiB0aGUgYm9ycm93ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBlc2Nyb3dfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9ycm93ZXIgaGFzIHByaXZhdGUgbW9ydGdhZ2UgaW5zdXJhbmNlIGluIGVmZmVjdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcG1pOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9ycm93ZXIgd2lsbCBwYXkgYSBwZW5hbHR5IGZvciBlYXJseSBwYXlvZmYgb2YgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3ByZXBheW1lbnRfcGVuYWx0eTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlSW50ZXJlc3RSYXRlfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGludGVyZXN0X3JhdGU6IE1vcnRnYWdlSW50ZXJlc3RSYXRlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3QgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBsb2FuLCBmb3IgZXhhbXBsZSBgY29udmVudGlvbmFsYCwgYGZpeGVkYCwgb3IgYHZhcmlhYmxlYC4gVGhpcyBmaWVsZCBpcyBwcm92aWRlZCBkaXJlY3RseSBmcm9tIHRoZSBsb2FuIHNlcnZpY2VyIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGVudW1lcmF0ZWQgc2V0IG9mIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdHlwZV9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGdWxsIGR1cmF0aW9uIG9mIG1vcnRnYWdlIGFzIGF0IG9yaWdpbmF0aW9uIChlLmcuIGAxMCB5ZWFyYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3Rlcm06IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3JpZ2luYWwgZGF0ZSBvbiB3aGljaCBtb3J0Z2FnZSBpcyBkdWUgaW4gZnVsbC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtYXR1cml0eV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIG5leHQgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfbW9udGhseV9wYXltZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHByaW5jaXBhbCBiYWxhbmNlIG9mIHRoZSBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX3ByaW5jaXBhbF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGxvYW4gKHByaW5jaXBhbCArIGludGVyZXN0KSBwYXN0IGR1ZSBmb3IgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHBhc3RfZHVlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcHJvcGVydHlfYWRkcmVzczogTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBpbnRlcmVzdCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFlURCBwcmluY2lwYWwgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9wcmluY2lwYWxfcGFpZDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZmllbGRzIGRlc2NyaWJpbmcgcHJvcGVydHkgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXZlIG9yIG5pbmUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIChleGFtcGxlIFxcXCJOQ1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIChleGFtcGxlIFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFwdCAxNVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGF0dHJpYnV0ZXMgdGhhdCBjb3VsZCBpbmRpY2F0ZSBpZiBhIGRvY3VtZW50IGlzIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBkb2N1bWVudF9yZWZlcmVuY2VzOiBBcnJheTxSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBzZXQgb2YgZG9jdW1lbnRzXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcmlza19zaWduYWxzOiBBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBuYW1lIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgbmFtZSBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmFtZU1hdGNoU2NvcmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTWF0Y2ggc2NvcmUgZm9yIG5hbWUuIDEwMCBpcyBhIHBlcmZlY3Qgc2NvcmUsIDk5LTg1IG1lYW5zIGEgc3Ryb25nIG1hdGNoLCA4NC03MCBpcyBhIHBhcnRpYWwgbWF0Y2gsIGFueSBzY29yZSBsZXNzIHRoYW4gNzAgaXMgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBuYW1lIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBmaXJzdCBvciBsYXN0IG5hbWUgY29tcGxldGVseSBtYXRjaGVkLCBsaWtlbHkgYSBmYW1pbHkgbWVtYmVyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfZmlyc3RfbmFtZV9vcl9sYXN0X25hbWVfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBuaWNrbmFtZSBtYXRjaGVkLCBleGFtcGxlIEplbm5pZmVyIGFuZCBKZW5uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX25pY2tuYW1lX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSXMgYHRydWVgIGlmIHRoZSBuYW1lIG9uIGVpdGhlciBvZiB0aGUgbmFtZXMgdGhhdCB3YXMgbWF0Y2hlZCBmb3IgdGhlIHNjb3JlIGNvbnRhaW5lZCBzdHJpbmdzIGluZGljYXRpdmUgb2YgYSBidXNpbmVzcyBuYW1lLCBzdWNoIGFzIFxcXCJDT1JQXFxcIiwgXFxcIkxMQ1xcXCIsIFxcXCJJTkNcXFwiLCBvciBcXFwiTFREXFxcIi4gQSBgdHJ1ZWAgcmVzdWx0IGdlbmVyYWxseSBpbmRpY2F0ZXMgdGhlIGVudGl0eSBpcyBhIGJ1c2luZXNzLiBIb3dldmVyLCBhIGBmYWxzZWAgcmVzdWx0IGRvZXMgbm90IG1lYW4gdGhlIGVudGl0eSBpcyBub3QgYSBidXNpbmVzcywgYXMgc29tZSBidXNpbmVzc2VzIGRvIG5vdCB1c2UgdGhlc2Ugc3RyaW5ncyBpbiB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlaXIgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNfYnVzaW5lc3NfbmFtZV9kZXRlY3RlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0UGF5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOZXRQYXkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWx9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWw/OiBUb3RhbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBkZXRlY3RzIGEgbmV3IGFjY291bnQgZm9yIEl0ZW1zIGNyZWF0ZWQgb3IgdXBkYXRlZCB3aXRoIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KS4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgY2FuIHByb21wdCB5b3VyIHVzZXJzIHRvIHNoYXJlIG5ldyBhY2NvdW50cyB3aXRoIHlvdSB0aHJvdWdoIFtBY2NvdW50IFNlbGVjdCB2MiB1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLyN1c2luZy11cGRhdGUtbW9kZS10by1yZXF1ZXN0LW5ldy1hY2NvdW50cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpZXIgbnVtYmVyIGRhdGEgdXNlZCB0byBjb25maWd1cmUgdGhlIHRlc3QgYWNjb3VudC4gQWxsIHZhbHVlcyBhcmUgb3B0aW9uYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVzZWQgZm9yIHRoZSBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfcm91dGluZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3dpcmVfcm91dGluZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgaW5zdGl0dXRpb24gbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9icmFuY2hgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfaW5zdGl0dXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGJyYW5jaCBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2luc3RpdHV0aW9uYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2JyYW5jaD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBCYW5rIGlkZW50aWZpZXIgY29kZSAoQklDKS4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2liYW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2JpYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCBudW1iZXIgKElCQU4pLiBJZiBubyBhY2NvdW50IG51bWJlciBpcyBzcGVjaWZpZWQgdmlhIGBhY2NvdW50YCwgd2lsbCBhbHNvIGJlIHVzZWQgYXMgdGhlIGFjY291bnQgbnVtYmVyIGJ5IGRlZmF1bHQuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9iaWNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2liYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQkFDUyBzb3J0IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYmFjc19zb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQUNBVFMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0FUU1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDQVRTIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXJzIGZvciB0aGUgY2xlYXJpbmdob3VzZXMgdGhhdCBhcmUgYXNzb2NjaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBpbiBvcmRlciBvZiByZWxldmFuY2UuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiB3ZSBjYW5cXCd0IHByb3ZpZGUgYW55IGFjY291bnQgbGV2ZWwgZGF0YS4gSW5zdGl0dXRpb24gbGV2ZWwgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGluc3RpdHV0aW9ucy9nZXQgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBkdGNfbnVtYmVyczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVVMgYWNjb3VudCB2aWEgQUNIIG9yIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0hcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0gge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnQuICBOb3RlIHRoYXQgd2hlbiB1c2luZyBPQXV0aCB3aXRoIENoYXNlIEJhbmsgKGBpbnNfNTZgKSwgQ2hhc2Ugd2lsbCBpc3N1ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZXNlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcnMgKGFsc28ga25vd24gYXMgVEFOcykgc2hvdWxkIHdvcmsgaWRlbnRpY2FsbHkgdG8gbm9ybWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlIGRpZ2l0cyByZXR1cm5lZCBpbiB0aGUgYG1hc2tgIGZpZWxkIHdpbGwgY29udGludWUgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGFjY291bnQgbnVtYmVyLCByYXRoZXIgdGhhbiB0aGUgdG9rZW5pemVkIGFjY291bnQgbnVtYmVyOyBmb3IgdGhpcyByZWFzb24sIHdoZW4gZGlzcGxheWluZyBhY2NvdW50IG51bWJlcnMgdG8gdGhlIHVzZXIgdG8gaGVscCB0aGVtIGlkZW50aWZ5IHRoZWlyIGFjY291bnQgaW4geW91ciBVSSwgYWx3YXlzIHVzZSB0aGUgYG1hc2tgIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgdGhlIGBhY2NvdW50YCBudW1iZXIuIElmIGEgdXNlciByZXZva2VzIHRoZWlyIHBlcm1pc3Npb25zIHRvIHlvdXIgYXBwLCB0aGUgdG9rZW5pemVkIG51bWJlcnMgd2lsbCBubyBsb25nZXIgd29yay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBJZiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc181NmAsIHRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGFjY291bnRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LCBpZiBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBpbnRvIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfaW4/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgb3V0IG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfb3V0PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNITnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnQuICBOb3RlIHRoYXQgd2hlbiB1c2luZyBPQXV0aCB3aXRoIENoYXNlIEJhbmsgKGBpbnNfNTZgKSwgQ2hhc2Ugd2lsbCBpc3N1ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZXNlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcnMgKGFsc28ga25vd24gYXMgVEFOcykgc2hvdWxkIHdvcmsgaWRlbnRpY2FsbHkgdG8gbm9ybWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlIGRpZ2l0cyByZXR1cm5lZCBpbiB0aGUgYG1hc2tgIGZpZWxkIHdpbGwgY29udGludWUgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGFjY291bnQgbnVtYmVyLCByYXRoZXIgdGhhbiB0aGUgdG9rZW5pemVkIGFjY291bnQgbnVtYmVyOyBmb3IgdGhpcyByZWFzb24sIHdoZW4gZGlzcGxheWluZyBhY2NvdW50IG51bWJlcnMgdG8gdGhlIHVzZXIgdG8gaGVscCB0aGVtIGlkZW50aWZ5IHRoZWlyIGFjY291bnQgaW4geW91ciBVSSwgYWx3YXlzIHVzZSB0aGUgYG1hc2tgIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgdGhlIGBhY2NvdW50YCBudW1iZXIuIElmIGEgdXNlciByZXZva2VzIHRoZWlyIHBlcm1pc3Npb25zIHRvIHlvdXIgYXBwLCB0aGUgdG9rZW5pemVkIG51bWJlcnMgd2lsbCBubyBsb25nZXIgd29yay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIElmIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzU2YCwgdGhpcyBtYXkgYmUgYSB0b2tlbml6ZWQgcm91dGluZyBudW1iZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYWNjb3VudGAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudCwgaWYgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBpbnRvIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9pbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBvdXQgb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQgdmlhIEFUT04uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBVE9OXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQVRPTiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FUT05cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FUT05cbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQkFDUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCQUNTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBDYW5hZGlhbiBiYW5rIGFjY291bnQgdmlhIEVGVC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0VGVFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0VGVCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0VGVE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGluc3RpdHV0aW9uIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0lCQU5OdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0lCQU5OdWxsYWJsZSB7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhbiBpbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCB2aWEgd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFuayBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBudW1iZXJzIHVzaW5nIHRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgYW5kIEJJQy9TV0lGVCBjb2RlIGZvcm1hdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQnVzaW5lc3MgSWRlbnRpZmllciBDb2RlLCBhbHNvIGtub3duIGFzIFNXSUZUIGNvZGUsIGZvciB0aGlzIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFuayBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVmFsaWQgdmFsdWVzIGFyZSBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPbWl0dGFibGVUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIG9wdGlvbiBzZWN1cml0eS4gIEZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBkYXRhIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgaXRlbSBpcyB1c2luZyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdCwgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uQ29udHJhY3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luYXRvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE90aGVyRmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyAgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgZm9yY2VfYXZhaWxhYmxlX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVPdmVycmlkZTtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xuICAgIC8qKlxuICAgICAqIGRvY3VtZW50X2lkIGlzIHRoZSBpZCBvZiB0aGUgZG9jdW1lbnQgdGhhdCB0aGlzIGlkZW50aXR5IGJlbG9uZ3MgdG9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgb3duZXIgb3Igb3duZXJzIG9mIGFuIGFjY291bnQuIEFueSBmaWVsZHMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGRlZmF1bHQgU2FuZGJveCBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJPdmVycmlkZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhlc2Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbmFtZXMgb2YgaW5kaXZpZHVhbHMsIGV2ZW4gZm9yIGJ1c2luZXNzIGFjY291bnRzLiBOb3RlIHRoYXQgdGhlIHNhbWUgbmFtZSBkYXRhIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBIb3cgYW4gYXNzZXQgaXMgb3duZWQuICBgYXNzb2NpYXRpb25gOiBPd25lcnNoaXAgYnkgYSBjb3Jwb3JhdGlvbiwgcGFydG5lcnNoaXAsIG9yIHVuaW5jb3Jwb3JhdGVkIGFzc29jaWF0aW9uLCBpbmNsdWRpbmcgZm9yLXByb2ZpdCBhbmQgbm90LWZvci1wcm9maXQgb3JnYW5pemF0aW9ucy4gYGluZGl2aWR1YWxgOiBPd25lcnNoaXAgYnkgYW4gaW5kaXZpZHVhbC4gYGpvaW50YDogSm9pbnQgb3duZXJzaGlwIGJ5IG11bHRpcGxlIHBhcnRpZXMuIGB0cnVzdGA6IE93bmVyc2hpcCBieSBhIHJldm9jYWJsZSBvciBpcnJldm9jYWJsZSB0cnVzdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE93bmVyc2hpcFR5cGUge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgSW5kaXZpZHVhbCA9ICdpbmRpdmlkdWFsJyxcbiAgICBKb2ludCA9ICdqb2ludCcsXG4gICAgQXNzb2NpYXRpb24gPSAnYXNzb2NpYXRpb24nLFxuICAgIFRydXN0ID0gJ3RydXN0J1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGEgcG9zdCBvZmZpY2UgYm94LiBXaWxsIGJlIGB5ZXNgIHdoZW4gYSBQLk8uIGJveCBpcyBkZXRlY3RlZCwgYG5vYCB3aGVuIFBsYWlkIGNvbmZpcm1lZCB0aGUgYWRkcmVzcyBpcyBub3QgYSBQLk8uIGJveCwgYW5kIGBub19kYXRhYCB3aGVuIFBsYWlkIHdhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIGFkZHJlc3MgaXMgYSBQLk8uIGJveC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBPQm94U3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0dWRlbnRcXCdzIGVsaWdpYmlsaXR5IGluIHRoZSBQdWJsaWMgU2VydmljZSBMb2FuIEZvcmdpdmVuZXNzIHByb2dyYW0uIFRoaXMgaXMgb25seSByZXR1cm5lZCBpZiB0aGUgaW5zdGl0dXRpb24gaXMgRmVkTG9hbiAoYGluc18xMTY1MjdgKS4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBTTEZTdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRpZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PFBhcnR5Pjtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyIGJlaW5nIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGVuZCBjdXN0b21lciBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciBvciBub3QgdGhlIHBhcnRuZXIgaGFzIGNvbXBsZXRlZCBhdHRlc3RhdGlvbiBvZiBkaWxpZ2VuY2UgZm9yIHRoZSBlbmQgY3VzdG9tZXIgdG8gYmUgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2RpbGlnZW5jZV9hdHRlc3RlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gYmUgZW5hYmxlZCBmb3IgdGhlIGVuZCBjdXN0b21lci4gSWYgZW1wdHkgb3IgYG51bGxgLCB0aGlzIGZpZWxkIHdpbGwgZGVmYXVsdCB0byB0aGUgcHJvZHVjdHMgZW5hYmxlZCBmb3IgdGhlIHJlc2VsbGVyIGF0IHRoZSB0aW1lIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGRlZmF1bHQgTGluayBjdXN0b21pemF0aW9uIHdpbGwgYmUgc2V0IHRvIG1hdGNoIHRoZSBwYXJ0bmVyXFwncy4gWW91IGNhbiBhbHdheXMgY2hhbmdlIHRoZSBlbmQgY3VzdG9tZXJcXCdzIExpbmsgY3VzdG9taXphdGlvbiBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBTZWUgdGhlIFtMaW5rIEN1c3RvbWl6YXRpb24gZG9jc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyZWF0ZV9saW5rX2N1c3RvbWl6YXRpb24/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEJhc2U2NC1lbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGxvZ28uIE11c3QgYmUgYSBQTkcgb2Ygc2l6ZSAxMDI0eDEwMjQgdW5kZXIgNE1CLiBUaGUgbG9nbyB3aWxsIGJlIHNoYXJlZCB3aXRoIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIHNob3duIHRvIHRoZSBlbmQgdXNlciBkdXJpbmcgTGluayBmbG93cy4gQSBsb2dvIGlzIHJlcXVpcmVkIGlmIGBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uYCBpcyBgdHJ1ZWAuIElmIGBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uYCBpcyBgZmFsc2VgIGFuZCB0aGUgbG9nbyBpcyBvbWl0dGVkLCB0aGUgcGFydG5lclxcJ3MgbG9nbyB3aWxsIGJlIHVzZWQgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIGEgc3RvY2sgbG9nbyB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxvZ28/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3MgbGVnYWwgbmFtZS4gVGhpcyB3aWxsIGJlIHNoYXJlZCB3aXRoIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYXMgcGFydCBvZiB0aGUgT0F1dGggcmVnaXN0cmF0aW9uIHByb2Nlc3MuIEl0IHdpbGwgbm90IGJlIHNob3duIHRvIGVuZCB1c2Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfZW50aXR5X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyB3ZWJzaXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24uIFRoaXMgd2lsbCBiZSBzaG93biB0byBlbmQgdXNlcnMgd2hlbiB0aGV5IGdvIHRocm91Z2ggdGhlIFBsYWlkIExpbmsgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVjaG5pY2FsX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJpbGxpbmdfY29udGFjdD86IFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfc3VwcG9ydF9pbmZvPzogUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mbztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSBwYXJ0bmVyIGhhcyBmb3J3YXJkZWQgdGhlIFBsYWlkIGJhbmsgYWRkZW5kdW0gdG8gdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2JhbmtfYWRkZW5kdW1fY29tcGxldGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldHNfdW5kZXJfbWFuYWdlbWVudD86IFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgVVJJcyBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbihzKSB3aGVyZSBhIHVzZXIgY2FuIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIHZpYSBhIHdlYnZpZXcuIFVSSXMgc2hvdWxkIG5vdCBjb250YWluIGFueSBxdWVyeSBwYXJhbWV0ZXJzLiBXaGVuIHVzZWQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCwgVVJJcyBtdXN0IHVzZSBodHRwcy4gVG8gc3BlY2lmeSBhbnkgc3ViZG9tYWluLCB1c2UgYCpgIGFzIGEgd2lsZGNhcmQgY2hhcmFjdGVyLCBlLmcuIGBodHRwczovL18qLmV4YW1wbGUuY29tL29hdXRoLmh0bWxgLiBUbyBtb2RpZnkgcmVkaXJlY3QgVVJJcyBmb3IgYW4gZW5kIGN1c3RvbWVyIGFmdGVyIGNyZWF0aW5nIHRoZW0sIGdvIHRvIHRoZSBlbmQgY3VzdG9tZXJcXCdzIFtBUEkgcGFnZV0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKSBpbiB0aGUgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIGEgZmluYW5jaWFsIGluc3RpdHV0aW9uIGJ5IHJlZ3VsYXRvcnkgYXV0aG9yaXRpZXMsIGlmIGFwcGxpY2FibGUuIEZvciBiYW5rcywgdGhpcyBpcyB0aGUgRkRJQyBDZXJ0aWZpY2F0ZSBOdW1iZXIuIEZvciBjcmVkaXQgdW5pb25zLCB0aGlzIGlzIHRoZSBDcmVkaXQgVW5pb24gQ2hhcnRlciBOdW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lzdHJhdGlvbl9udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXI/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2R1Y3Rpb25fc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmbG93ZG93bl9zdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJGbG93ZG93blN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHF1ZXN0aW9ubmFpcmVfc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyUXVlc3Rpb25uYWlyZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGggaW5zdGl0dXRpb25zIHdpdGggd2hpY2ggdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24gaXMgYmVpbmcgcmVnaXN0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM/OiBBcnJheTxQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIHJlbW92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIGFuIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0cyB1bmRlciBtYW5hZ2VtZW50IGZvciB0aGUgZ2l2ZW4gZW5kIGN1c3RvbWVyLiBSZXF1aXJlZCBmb3IgZW5kIGN1c3RvbWVycyB3aXRoIG1vbnRobHkgc2VydmljZSBjb21taXRtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYmlsbGluZyBjb250YWN0IGZvciB0aGUgZW5kIGN1c3RvbWVyLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyBiaWxsaW5nIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gICAgICovXG4gICAgZmFtaWx5X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyBwdWJsaWMuIFVzZXJzIG9mIHlvdXIgYXBwIHdpbGwgc2VlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBtYW5hZ2luZyBjb25uZWN0aW9ucyBiZXR3ZWVuIHlvdXIgYXBwIGFuZCB0aGVpciBiYW5rIGFjY291bnRzIGluIFBsYWlkIFBvcnRhbC4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgY3VzdG9tZXIgc3VwcG9ydCBpbmZvIGlmIG9taXR0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm8ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgY29udGFjdF91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGxpbmtfdXBkYXRlX3VybD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgYWRkZW5kdW0gdG8gdGhlIFBsYWlkIE1TQSAoXFxcImZsb3dkb3duXFxcIikgZm9yIHRoZSBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJGbG93ZG93blN0YXR1cyB7XG4gICAgTm90U3RhcnRlZCA9ICdOT1RfU1RBUlRFRCcsXG4gICAgSW5SZXZpZXcgPSAnSU5fUkVWSUVXJyxcbiAgICBOZWdvdGlhdGlvbiA9ICdORUdPVElBVElPTicsXG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnXG59XG5cbi8qKlxuICogVGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudHM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIHdhcyBhcHByb3ZlZCBieSB0aGUgaW5zdGl0dXRpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVpciBhcHBsaWNhdGlvbiBoYXMgbm90IHlldCBiZWVuIGFwcHJvdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uX2VuYWJsZW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggbm9uLU9BdXRoIEl0ZW0gYWRkcyB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgZm9yIHRoaXMgaW5zdGl0dXRpb24sIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBzdWNoIGRhdGUgaGFzIGJlZW4gc2V0IGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgY2xhc3NpY19kaXNhYmxlbWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHJlZ2lzdHJhdGlvbiBzdGF0dXMgZm9yIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BST0NFU1NJTkcnLFxuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBFbmFibGVkID0gJ0VOQUJMRUQnLFxuICAgIEF0dGVudGlvblJlcXVpcmVkID0gJ0FUVEVOVElPTl9SRVFVSVJFRCdcbn1cblxuLyoqXG4gKiBSZWdpc3RyYXRpb24gc3RhdHVzZXMgYnkgZW52aXJvbm1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gICAgICovXG4gICAgZGV2ZWxvcG1lbnQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICAgICAqL1xuICAgIHByb2R1Y3Rpb24/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBPQXV0aCBzdGF0dXMgb2YgdGhlIHVwZGF0ZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzIHtcbiAgICBOb3RTdGFydGVkID0gJ25vdC1zdGFydGVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBFbmFibGVkID0gJ2VuYWJsZWQnLFxuICAgIEF0dGVudGlvblJlcXVpcmVkID0gJ2F0dGVudGlvbi1yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBUaGUgd2ViaG9vayBvZiB0eXBlIGBQQVJUTkVSYCBhbmQgY29kZSBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYCB3aWxsIGJlIGZpcmVkIHdoZW4gYSBwYXJ0bmVyXFwncyBlbmQgY3VzdG9tZXIgaGFzIGFuIHVwZGF0ZSBvbiB0aGVpciBPQXV0aCByZWdpc3RyYXRpb24gc3RhdHVzIHdpdGggYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjdXJpdHkgcXVlc3Rpb25uYWlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFJlY2VpdmVkID0gJ1JFQ0VJVkVEJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0cyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyIGluIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHNcbiAgICAgKi9cbiAgICBzYW5kYm94Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgZGV2ZWxvcG1lbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIGVuZCBjdXN0b21lci4gIGBVTkRFUl9SRVZJRVdgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy4gVGhlIGVuZCBjdXN0b21lciBtdXN0IGJlIG1hbnVhbGx5IHJldmlld2VkIGJ5IHRoZSBQbGFpZCB0ZWFtIGJlZm9yZSBpdCBjYW4gYmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uLCBhdCB3aGljaCBwb2ludCBpdHMgc3RhdHVzIHdpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0aW9uIHRvIGBQRU5ESU5HX0VOQUJMRU1FTlRgIG9yIGBERU5JRURgLiAgYFBFTkRJTkdfRU5BQkxFTUVOVGA6IFRoZSBlbmQgY3VzdG9tZXIgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gQ2FsbCB0aGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgdG8gZW5hYmxlIHRoZSBlbmQgY3VzdG9tZXIgaW4gUHJvZHVjdGlvbi4gIGBBQ1RJVkVgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGVuYWJsZWQgaW4gYWxsIGVudmlyb25tZW50cy4gIGBERU5JRURgOiBUaGUgZW5kIGN1c3RvbWVyIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cywgYnV0IGl0IGRpZCBub3QgcGFzcyByZXZpZXcgYnkgdGhlIFBsYWlkIHRlYW0gYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGFsayB0byB5b3VyIEFjY291bnQgTWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cyB7XG4gICAgVW5kZXJSZXZpZXcgPSAnVU5ERVJfUkVWSUVXJyxcbiAgICBQZW5kaW5nRW5hYmxlbWVudCA9ICdQRU5ESU5HX0VOQUJMRU1FTlQnLFxuICAgIEFjdGl2ZSA9ICdBQ1RJVkUnLFxuICAgIERlbmllZCA9ICdERU5JRUQnXG59XG5cbi8qKlxuICogVGhlIHRlY2huaWNhbCBjb250YWN0IGZvciB0aGUgZW5kIGN1c3RvbWVyLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyB0ZWNobmljYWwgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVuZCBjdXN0b21lciwgaW5jbHVkaW5nIHNlY3JldHMgZm9yIG5vbi1Qcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHNlY3JldHM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBhcnR5IHRvIGEgdHJhbnNhY3Rpb24uIEluY2x1ZGVkIGRpcmVjdCBwYXJ0aWNpcGFudHMgbGlrZSB0aGUgYm9ycm93ZXIgYW5kIHNlbGxlciBhcyB3ZWxsIGFzIGluZGlyZWN0IHBhcnRpY2lwYW50cyBzdWNoIGFzIHRoZSBmbG9vZCBjZXJ0aWZpY2F0ZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5SW5kaXZpZHVhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFJPTEVTOiBSb2xlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnR5SW5kaXZpZHVhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogSW5kaXZpZHVhbE5hbWU7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uQSB2YWx1ZSBmcm9tIGEgTUlTTU8gZGVmaW5lZCBsaXN0IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9sZSB0aGF0IHRoZSBwYXJ0eSBwbGF5cyBpbiB0aGUgdHJhbnNhY3Rpb24uIFBhcnRpZXMgbWF5IGJlIGVpdGhlciBhIHBlcnNvbiBvciBsZWdhbCBlbnRpdHkuIEEgcGFydHkgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMgaW4gYSB0cmFuc2FjdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnR5Um9sZVR5cGUge1xuICAgIEJvcnJvd2VyID0gJ0JvcnJvd2VyJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtb25ldGFyeSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBudW1lcmljYWwgYW1vdW50IG9mIGEgc3BlY2lmaWMgY3VycmVuY3kuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW5jeSBjb2RlLCBlLmcuIFVTRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlGcmVxdWVuY3kge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5VmFsdWV9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZhbHVlOiBQYXlGcmVxdWVuY3lWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlGcmVxdWVuY3lWYWx1ZSB7XG4gICAgTW9udGhseSA9ICdtb250aGx5JyxcbiAgICBTZW1pbW9udGhseSA9ICdzZW1pbW9udGhseScsXG4gICAgV2Vla2x5ID0gJ3dlZWtseScsXG4gICAgQml3ZWVrbHkgPSAnYml3ZWVrbHknLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheV9kYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIHN0YXJ0IGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5RW51bSB7XG4gICAgUGF5RnJlcXVlbmN5VW5rbm93biA9ICdQQVlfRlJFUVVFTkNZX1VOS05PV04nLFxuICAgIFBheUZyZXF1ZW5jeVdlZWtseSA9ICdQQVlfRlJFUVVFTkNZX1dFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5Qml3ZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9CSVdFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5U2VtaW1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9TRU1JTU9OVEhMWScsXG4gICAgUGF5RnJlcXVlbmN5TW9udGhseSA9ICdQQVlfRlJFUVVFTkNZX01PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NUb3RhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzVG90YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YlBheVBlcmlvZERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd246IEFycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgcGVyaW9kIGVuZGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5nczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgc3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2Jhc2lzPzogQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBzdGFydGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViVGF4cGF5ZXJJRFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YlRheHBheWVySUQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50XG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC4gTWluaW11bSBhY2NlcHRlZCB2YWx1ZSBpcyBgMWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwYXltZW50LiBGb3Igc3RhbmRpbmcgb3JkZXJzIGFuZCBwYXltZW50IGNvbnNlbnRzLCBgXFxcIkdCUFxcXCJgIG11c3QgYmUgdXNlZC4gRm9yIFBvbGFuZCwgRGVubWFyaywgU3dlZGVuIGFuZCBOb3J3YXksIG9ubHkgdGhlIGxvY2FsIGN1cnJlbmN5IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50QW1vdW50Q3VycmVuY3kge1xuICAgIEdicCA9ICdHQlAnLFxuICAgIEV1ciA9ICdFVVInLFxuICAgIFBsbiA9ICdQTE4nLFxuICAgIFNlayA9ICdTRUsnLFxuICAgIERrayA9ICdES0snLFxuICAgIE5vayA9ICdOT0snXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudE51bGxhYmxlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50TnVsbGFibGVcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50UmVmdW5kZWQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q2hhbm5lbCB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogTWF4aW11bSBhbW91bnQgb2YgYSBzaW5nbGUgcGF5bWVudCBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFdoZXJlIHRoZSBwYXltZW50IGNvbnNlbnQgcGVyaW9kIHNob3VsZCBzdGFydC4gIGBDQUxFTkRBUmA6IGxpbmUgdXAgd2l0aCBhIGNhbGVuZGFyLiAgYENPTlNFTlRgOiBvbiB0aGUgZGF0ZSBvZiBjb25zZW50IGNyZWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0FsaWdubWVudCB7XG4gICAgQ2FsZW5kYXIgPSAnQ0FMRU5EQVInLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGNvbnNlbnQgcGF5bWVudHMgbGltaXRhdGlvbnMgcGVyIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50UGVyaW9kaWNJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50UGVyaW9kaWNBbGlnbm1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBhbGlnbm1lbnQ6IFBheW1lbnRDb25zZW50UGVyaW9kaWNBbGlnbm1lbnQ7XG59XG4vKipcbiAqIE1heGltdW0gY3VtdWxhdGl2ZSBhbW91bnQgZm9yIGFsbCBwYXltZW50cyBpbiB0aGUgc3BlY2lmaWVkIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC4gTWluaW11bSBhY2NlcHRlZCB2YWx1ZSBpcyBgMWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFBheW1lbnQgY29uc2VudCBwZXJpb2RpYyBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRDb25zZW50UGVyaW9kaWNJbnRlcnZhbCB7XG4gICAgRGF5ID0gJ0RBWScsXG4gICAgV2VlayA9ICdXRUVLJyxcbiAgICBNb250aCA9ICdNT05USCcsXG4gICAgWWVhciA9ICdZRUFSJ1xufVxuXG4vKipcbiAqIExpZmUgc3BhbiBmb3IgdGhlIHBheW1lbnQgY29uc2VudC4gQWZ0ZXIgdGhlIGB0b2AgZGF0ZSB0aGUgcGF5bWVudCBjb25zZW50IGV4cGlyZXMgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgZnJvbSB3aGljaCB0aGUgY29uc2VudCBzaG91bGQgYmUgYWN0aXZlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgZnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIGNvbnNlbnQgZXhwaXJlcywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIHRvPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50XFwncyBiYW5rIGFjY291bnQuIFJlcXVpcmVkIGJ5IG1vc3QgaW5zdGl0dXRpb25zIG91dHNpZGUgb2YgdGhlIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IGNvbnNlbnQgc2NvcGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHNjb3BlczogQXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xufVxuLyoqXG4gKiBMaW1pdGF0aW9ucyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBwYXltZW50cyBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIHZhbGlkX2RhdGVfdGltZT86IFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICBtYXhfcGF5bWVudF9hbW91bnQ6IFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYW1vdW50IGxpbWl0YXRpb25zIHBlciBwZXJpb2Qgb2YgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgcGVyaW9kaWNfYW1vdW50czogQXJyYXk8UGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudD47XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuIFRoZSBjcmVhdGVkIGNvbnNlbnQgY2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgZnVuZHMgdG8gdGhpcyByZWNpcGllbnQgb25seS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge1NldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY29wZXM6IFNldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIENvbnNlbnQgY3JlYXRpb24gdGltZXN0YW1wLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCBjb25zZW50IHNjb3Blcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3BlczogQXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgY29uc2VudCBwYXltZW50LiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIGNvbnNlbnQgcGF5bWVudCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBwYXltZW50IGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHBheW1lbnQgdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHNjb3BlLiBEZWZpbmVzIHBvc3NpYmxlIGRpcmVjdGlvbnMgZm9yIHBheW1lbnRzIG1hZGUgd2l0aCB0aGUgZ2l2ZW4gY29uc2VudC4gIGBNRV9UT19NRWA6IEFsbG93cyBtb3ZpbmcgbW9uZXkgYmV0d2VlbiBhY2NvdW50cyBvd25lZCBieSB0aGUgc2FtZSB1c2VyLiAgYEVYVEVSTkFMYDogQWxsb3dzIGluaXRpYXRpbmcgcGF5bWVudHMgZnJvbSB0aGUgdXNlclxcJ3MgYWNjb3VudCB0byB0aGlyZCBwYXJ0aWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUge1xuICAgIE1lVG9NZSA9ICdNRV9UT19NRScsXG4gICAgRXh0ZXJuYWwgPSAnRVhURVJOQUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudCBjb25zZW50LiAgYFVOQVVUSE9SSVNFRGA6IENvbnNlbnQgY3JlYXRlZCwgYnV0IHJlcXVpcmVzIHVzZXIgYXV0aG9yaXNhdGlvbi4gIGBSRUpFQ1RFRGA6IENvbnNlbnQgYXV0aG9yaXNhdGlvbiB3YXMgcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYW5kL29yIHRoZSBiYW5rLiAgYEFVVEhPUklTRURgOiBDb25zZW50IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gIGBSRVZPS0VEYDogQ29uc2VudCBoYXMgYmVlbiByZXZva2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICBgRVhQSVJFRGA6IENvbnNlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzIHtcbiAgICBVbmF1dGhvcmlzZWQgPSAnVU5BVVRIT1JJU0VEJyxcbiAgICBBdXRob3Jpc2VkID0gJ0FVVEhPUklTRUQnLFxuICAgIFJldm9rZWQgPSAnUkVWT0tFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUkVKRUNURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIHdoYXQgc3BlY2lmaWMgcGF5bWVudCBjb25maWd1cmF0aW9ucyBhbiBpbnN0aXR1dGlvbiBzdXBwb3J0cyB3aGVuIG1ha2luZyBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudHMgZnJvbSBhIGRpZmZlcmVudCBjb3VudHJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfaW50ZXJuYXRpb25hbF9wYXltZW50czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgU0VQQSBJbnN0YW50IHBheW1lbnRzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc2VwYV9pbnN0YW50OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbWFwcGluZyBvZiBjdXJyZW5jeSB0byBtYXhpbXVtIHBheW1lbnQgYW1vdW50IChkZW5vbWluYXRlZCBpbiB0aGUgc21hbGxlc3QgdW5pdCBvZiBjdXJyZW5jeSkgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIEV4YW1wbGU6IGB7XFxcIkdCUFxcXCI6IFxcXCIxMDAwMFxcXCJ9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXhpbXVtX3BheW1lbnRfYW1vdW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcmV0dXJuaW5nIHJlZnVuZCBkZXRhaWxzIHdoZW4gaW5pdGlhdGluZyBhIHBheW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19yZWZ1bmRfZGV0YWlsczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFuZGluZ19vcmRlcl9tZXRhZGF0YTogUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdXNlZCB0byByZXN0cmljdCB0aGUgYWNjb3VudHMgdXNlZCBmb3IgcGF5bWVudHMuIElmIHByb3ZpZGVkLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50UmVmdW5kZWR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LiBUaGlzIG11c3QgYmUgYW4gYWxwaGFudW1lcmljIHN0cmluZyB3aXRoIGF0IG1vc3QgMTggY2hhcmFjdGVycyBhbmQgbXVzdCBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIChzaW5jZSBub3QgYWxsIGluc3RpdHV0aW9ucyBzdXBwb3J0IHRoZW0pLiBJbiBvcmRlciB0byB0cmFjayBzZXR0bGVtZW50IHZpYSBQYXltZW50IENvbmZpcm1hdGlvbiwgZWFjaCBwYXltZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSByZWZlcmVuY2UuIElmIHRoZSByZWZlcmVuY2UgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQVBJIGlzIG5vdCB1bmlxdWUsIFBsYWlkIHdpbGwgYWRqdXN0IGl0LiBCb3RoIHRoZSBvcmlnaW5hbGx5IHByb3ZpZGVkIGFuZCBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHJlZmVyZW5jZXMgKGlmIGFueSkgY2FuIGJlIGZvdW5kIGluIHRoZSBgcmVmZXJlbmNlYCBhbmQgYGFkanVzdGVkX3JlZmVyZW5jZWAgZmllbGRzLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRm9yIGEgcGF5bWVudCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LCB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSB2YWx1ZTogIGBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgOiBUaGUgaW5pdGlhbCBwaGFzZSBvZiB0aGUgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlU3RhdHVzIHtcbiAgICBQYXltZW50U3RhdHVzSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcGF5bWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlZnVuZCBJRHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW1lbnRzIHRvIHJldHVybi4gSWYgYGNvdW50YCBpcyBub3Qgc3BlY2lmaWVkLCBhIG1heGltdW0gb2YgMTAgcGF5bWVudHMgd2lsbCBiZSByZXR1cm5lZCwgYmVnaW5uaW5nIHdpdGggdGhlIG1vc3QgcmVjZW50IHBheW1lbnQgYmVmb3JlIHRoZSBjdXJzb3IgKGlmIHNwZWNpZmllZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIFxcXCIyMDE5LTEyLTA2VDIyOjM1OjQ5WlxcXCIpLiBPbmx5IHBheW1lbnRzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjdXJzb3Igd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuIElmIHNwZWNpZmllZCwgb25seSBwYXltZW50cywgZXhlY3V0ZWQgdXNpbmcgdGhpcyBjb25zZW50LCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfaWRgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhhdCwgd2hlbiB1c2VkIGFzIHRoZSBvcHRpb25hbCBgY3Vyc29yYCBwYXJhbWV0ZXIgdG8gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCwgd2lsbCByZXR1cm4gdGhlIG5leHQgdW5yZXR1cm5lZCBwYXltZW50IGFzIGl0cyBmaXJzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50IHRvIHJldmVyc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHJlZnVuZC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFRvUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IFBheW1lbnRBbW91bnRUb1JlZnVuZDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlZnVuZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50LiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgYWxsIHBheW1lbnRzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGF5bWVudCBpcyB3YWl0aW5nIG9uIHVzZXIgaW5wdXQgdG8gY29udGludWUgcHJvY2Vzc2luZy4gQSBwYXltZW50IG1heSByZS1lbnRlciB0aGlzIHN0YXRlIGxhdGVyIG9uIGlmIGZ1cnRoZXIgaW5wdXQgaXMgbmVlZGVkLiAgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhdXRob3Jpc2VkIGFuZCBhY2NlcHRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3Igc3VjY2Vzc2Z1bCBwYXltZW50cywgdGhpcyBpcyBhIHBvdGVudGlhbCB0ZXJtaW5hbCBzdGF0dXMuIEZ1cnRoZXIgc3RhdHVzIHRyYW5zaXRpb25zIGNhbiBiZSB0byBSRUpFQ1RFRCBhbmQsIHdoZW4gc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgdG8gRVhFQ1VURUQuICBgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFBBWU1FTlRfU1RBVFVTX0ZBSUxFRGA6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgdG8gYmUgaW5pdGlhdGVkLiBUaGlzIGVycm9yIG1heSBiZSBjYXVzZWQgYnkgdHJhbnNpZW50IHN5c3RlbSBvdXRhZ2VzIGFuZCBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC4gIGBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gYmxvY2tlZCBieSBQbGFpZC4gVGhpcyBjYW4gb2NjdXIsIGZvciBleGFtcGxlLCBkdWUgdG8gUGxhaWQgZmxhZ2dpbmcgdGhlIHBheW1lbnQgYXMgcG90ZW50aWFsbHkgcmlza3kuIFRoaXMgaXMgYSByZXRyeWFibGUgZXJyb3IuICBgUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBoYXMgYXV0aG9yaXNlZCB0aGUgdHJhbnNhY3Rpb24uICBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYDogVGhlIHBheW1lbnQgd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSBlbmQgdXNlcikgZHVyaW5nIGF1dGhvcmlzYXRpb24uICBgUEFZTUVOVF9TVEFUVVNfRVhFQ1VURURgOiBUaGUgZnVuZHMgaGF2ZSBzdWNjZXNzZnVsbHkgbGVmdCB0aGUgcGF5ZXIgYWNjb3VudCBhbmQgcGF5bWVudCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBzdXBwb3J0IHRoaXMgc3RhdHVzOiBzdXBwb3J0IGlzIG1vcmUgY29tbW9uIGluIHRoZSBVSywgYW5kIGxlc3MgY29tbW9uIGluIHRoZSBFVS4gRm9yIGluc3RpdHV0aW9ucyB3aGVyZSB0aGlzIHN0YXR1cyBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgdGVybWluYWwgc3RhdHVzIGZvciBhIHN1Y2Nlc3NmdWwgcGF5bWVudCB3aWxsIGJlIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgLiAgYFBBWU1FTlRfU1RBVFVTX1NFVFRMRURgOiBUaGUgcGF5bWVudCBoYXMgc2V0dGxlZCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLiBBIHBheW1lbnQgd2lsbCB0eXBpY2FsbHkgc2V0dGxlIHdpdGhpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHdoaWNoIHBheW1lbnQgcmFpbCBpcyB1c2VkLiBUaGlzIHN0YXR1cyBpcyBvbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgdXNpbmcgW1BsYWlkIFZpcnR1YWwgQWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdmlydHVhbC1hY2NvdW50cy8pLiAgYFBBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy4gIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGA6IFRoZSBwYXltZW50IHdhcyByZWplY3RlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRGVwcmVjYXRlZDogVGhlc2Ugc3RhdHVzZXMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuICBgUEFZTUVOVF9TVEFUVVNfVU5LTk9XTmA6IFRoZSBwYXltZW50IHN0YXR1cyBpcyB1bmtub3duLiAgYFBBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTicsXG4gICAgRXhlY3V0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfRVhFQ1VURUQnLFxuICAgIFNldHRsZWQgPSAnUEFZTUVOVF9TVEFUVVNfU0VUVExFRCcsXG4gICAgQXV0aG9yaXNpbmcgPSAnUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkcnLFxuICAgIENhbmNlbGxlZCA9ICdQQVlNRU5UX1NUQVRVU19DQU5DRUxMRUQnLFxuICAgIEVzdGFibGlzaGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEJyxcbiAgICBSZWplY3RlZCA9ICdQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBgcGF5bWVudF90b2tlbmAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciB0aGUgcGF5bWVudCBpbml0aWF0aW9uIGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSB0b2tlbiB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBwYXltZW50X3Rva2VuYCBleHBpcmVzIGFmdGVyIDE1IG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW5fZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gcmVjaXBpZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVjaXBpZW50LiBXZSByZWNvbW1lbmQgdXNpbmcgc3RyaW5ncyBvZiBsZW5ndGggMTggb3IgbGVzcyBhbmQgYXZvaWQgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggYWxsIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuIElmIEJBQ1MgZGF0YSBpcyBub3QgcHJvdmlkZWQsIGFuIElCQU4gaXMgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3JlY2lwaWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2ZcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IHJlY2lwaWVudHMgY3JlYXRlZCBmb3IgUGF5bWVudCBJbml0aWF0aW9uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB2YWxpZCBQYXltZW50IEluaXRpYXRpb24gc3RhbmRpbmcgb3JkZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIGNsb3NlZC1lbmRlZCBzdGFuZGluZyBvcmRlcnMgYnkgcHJvdmlkaW5nIGFuIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX2VuZF9kYXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGBNT05USExZYCBzdGFuZGluZyBvcmRlcnMuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBuZWdhdGl2ZSBpbnRlZ2VycyAoLTEgdG8gLTUpIGZvciBzZXR0aW5nIHVwIGEgYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX25lZ2F0aXZlX2V4ZWN1dGlvbl9kYXlzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgdmFsaWQgc3RhbmRpbmcgb3JkZXIgaW50ZXJ2YWxzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICB2YWxpZF9zdGFuZGluZ19vcmRlcl9pbnRlcnZhbHM6IEFycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gaW50ZXItYmFuayB0cmFuc2ZlcnMuIElmIHRoZSB0cmFuc2FjdGlvbiB3YXMgbm90IGFuIGludGVyLWJhbmsgdHJhbnNmZXIsIGFsbCBmaWVsZHMgd2lsbCBiZSBgbnVsbGAuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoZSBgcGF5bWVudF9tZXRhYCBrZXkgd2lsbCBhbHdheXMgYXBwZWFyLCBidXQgbm8gZGF0YSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudE1ldGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRNZXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSBudW1iZXIgc3VwcGxpZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBQUEQgSUQgZm9yIHRoZSBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBwZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNmZXJzLCB0aGUgcGFydHkgdGhhdCBpcyByZWNlaXZpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnR5IGluaXRpYXRpbmcgYSB3aXJlIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGEgd2lyZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIGJ5X29yZGVyX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHBheWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0cmFuc2ZlciwgZS5nLiBcXCdBQ0hcXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0aG9kOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXltZW50IHByb2Nlc3NvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9jZXNzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlYXNvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIHVwZGF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgY3JlYXRlZCBhdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyBkZWxldGVkIGF0LiBBbHdheXMgYG51bGxgIGlmIHRoZSBQYXltZW50IFByb2ZpbGUgaGFzIG5vdCBiZWVuIGRlbGV0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFByb2ZpbGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRQcm9maWxlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUuICBgUkVBRFlgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyByZWFkeSB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC4gIGBQRU5ESU5HYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaXMgbm90IHJlYWR5IHRvIGJlIHVzZWQuIFlvdeKAmWxsIG5lZWQgdG8gY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkIHRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZS4gIGBSRU1PVkVEYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRQcm9maWxlU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFJlYWR5ID0gJ1JFQURZJyxcbiAgICBSZW1vdmVkID0gJ1JFTU9WRUQnXG59XG5cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBpbnRlcnZhbCBvZiB0aGUgcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlZHVsZUludGVydmFsIHtcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknXG59XG5cbi8qKlxuICogUGF5bWVudCBzY2hlbWUuIElmIG5vdCBzcGVjaWZpZWQgLSB0aGUgZGVmYXVsdCBpbiB0aGUgcmVnaW9uIHdpbGwgYmUgdXNlZCAoZS5nLiBgU0VQQV9DUkVESVRfVFJBTlNGRVJgIGZvciBFVSkuIFVzaW5nIHVuc3VwcG9ydGVkIHZhbHVlcyB3aWxsIHJlc3VsdCBpbiBhIGZhaWxlZCBwYXltZW50LiAgYExPQ0FMX0RFRkFVTFRgOiBUaGUgZGVmYXVsdCBwYXltZW50IHNjaGVtZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtldCBhbmQgY3VycmVuY3kgd2lsbCBiZSB1c2VkLiAgYExPQ0FMX0lOU1RBTlRgOiBUaGUgaW5zdGFudCBwYXltZW50IHNjaGVtZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtldCBhbmQgY3VycmVuY3kgd2lsbCBiZSB1c2VkIChpZiBhcHBsaWNhYmxlKS4gRmVlcyBtYXkgYmUgYXBwbGllZCBieSB0aGUgaW5zdGl0dXRpb24uIElmIHRoZSBtYXJrZXQgZG9lcyBub3Qgc3VwcG9ydCBhbiBJbnN0YW50IFNjaGVtZSAoZS5nLiBEZW5tYXJrKSwgdGhlIGRlZmF1bHQgaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHVzZWQuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlRgOiBJbnN0YW50IHBheW1lbnQgd2l0aGluIHRoZSBTRVBBIGFyZWEuIE1heSBpbnZvbHZlIGFkZGl0aW9uYWwgZmVlcyBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgYXQgc29tZSBiYW5rcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlbWUge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgTG9jYWxEZWZhdWx0ID0gJ0xPQ0FMX0RFRkFVTFQnLFxuICAgIExvY2FsSW5zdGFudCA9ICdMT0NBTF9JTlNUQU5UJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXIgPSAnU0VQQV9DUkVESVRfVFJBTlNGRVInLFxuICAgIFNlcGFDcmVkaXRUcmFuc2Zlckluc3RhbnQgPSAnU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfU1RBVFVTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgZm9yIHRoZSBwYXltZW50IGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb2xkX3BheW1lbnRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugd2hlbiBjcmVhdGluZyB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3JlZmVyZW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYHN0YXJ0X2RhdGVgIHByb3ZpZGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZGluZyBvcmRlci4gSWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIG9yIGlmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWNjb3VudCBsZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEluY29tZVJhdGVPZlBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcmF0ZV9vZl9wYXk6IFBheXJvbGxJbmNvbWVSYXRlT2ZQYXk7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBwYXlyb2xsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheSBzdHVicyBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFBheVN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgcGF5X3N0dWJzOiBBcnJheTxDcmVkaXRQYXlTdHViPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSBXLTJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRXMj59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICB3MnM6IEFycmF5PENyZWRpdFcyPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSAxMDk5cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0MTA5OT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBmb3JtMTA5OXM6IEFycmF5PENyZWRpdDEwOTk+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYXRlIGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSByYXRlIGF0IHdoaWNoIGFuIGVtcGxveWVlIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICAgICAqL1xuICAgIHBheV9yYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGF0IHdoaWNoIGFuIGVtcGxveWVlIGlzIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICAgICAqL1xuICAgIHBheV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF5cm9sbCBpdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZU9iamVjdD59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU6IEFycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1TdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJdGVtU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRGVub3RlcyB0aGUgcHJvY2Vzc2luZyBzdGF0dXMgZm9yIHRoZSB2ZXJpZmljYXRpb24uICBgVU5LTk9XTmA6IFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIHVzZXIgaGFzIGFwcHJvdmVkIGZvciBzaGFyaW5nLiBUaGUgZGF0YSBpcyBhdmFpbGFibGUgdG8gYmUgcmV0cmlldmVkLiAgYFBST0NFU1NJTkdgOiBUaGUgdmVyaWZpY2F0aW9uIGlzIHN0aWxsIHByb2Nlc3NpbmcuIFRoZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUgeWV0LiAgYEZBSUxFRGA6IFRoZSBwcm9jZXNzaW5nIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuICBgQVBQUk9WQUxfU1RBVFVTX1BFTkRJTkdgOiBUaGUgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkIGJ1dCB0aGUgdXNlciBoYXMgbm90IHlldCBhcHByb3ZlZCB0aGUgc2hhcmluZyBvZiB0aGUgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHByb2Nlc3Npbmdfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZnJhdWQgcmlzayBkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIEl0ZW0gbGlua2VkIGFzIHBhcnQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbFJpc2tTaWduYWxzSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaW5jb21lIGRvY3VtZW50IGF1dGhlbnRpY2l0eSBkYXRhIHJldHJpZXZlZCBmb3IgZWFjaCBvZiB0aGUgdXNlclxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3Jpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdD47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IERlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRvY19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzOiBFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBQYXlzdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X2RldGFpbHM/OiBFbXBsb3ltZW50RGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgbmV0X3BheTogTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlQZXJpb2REZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5c3R1Yl9kZXRhaWxzPzogUGF5c3R1YkRldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViWVRERGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX2Vhcm5pbmdzPzogUGF5c3R1YllURERldGFpbHM7XG59XG4vKipcbiAqIEFkZHJlc3Mgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXRlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWR1Y3Rpb24gb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uLCBhcyBwcm92aWRlZCBvbiB0aGUgcGF5c3R1Yi4gRm9yIGV4YW1wbGU6IGBcXFwiNDAxKGspXFxcImAsIGBcXFwiRklDQSBNRUQgVEFYXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBkZWR1Y3Rpb24gaXMgcHJlLXRheDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICBpc19wcmV0YXg6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGV0YWlscyB0aGF0IGNhbiBiZSBmb3VuZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQmVnaW5uaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmRpbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2VuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQYXkgZGF0ZSBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIHBheXN0dWIsIGUuZy4gQURQXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlzdHViX3Byb3ZpZGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YlBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5c3R1YlBheUZyZXF1ZW5jeSB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1YlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZnJvbSBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llZT86IFBheXN0dWJPdmVycmlkZUVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzPzogUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogVGhlIGVtcGxveWVlIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBvZiB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgZW1wbG95ZWUgaXMgcGFpZC4gUG9zc2libGUgdmFsdWVzOiBgTU9OVEhMWWAsIGBCSS1XRUVLTFlgLCBgV0VFS0xZYCwgYFNFTUktTU9OVEhMWWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlzdHViUGF5RnJlcXVlbmN5IHtcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEJpV2Vla2x5ID0gJ0JJLVdFRUtMWScsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSS1NT05USExZJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBvZiBpbmNvbWUgZWFybmVkIHllYXIgdG8gZGF0ZSwgYXMgYmFzZWQgb24gcGF5c3R1YiBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgZ3Jvc3MgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YllURERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWWVhci10by1kYXRlIG5ldCAodGFrZSBob21lKSBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIG5ldF9lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbeKAmXMgYWNjZXNzIGNvbnNlbnQgaXMgZXhwaXJpbmcgaW4gNyBkYXlzLiBTb21lIEl0ZW1zIGhhdmUgZXhwbGljaXQgZXhwaXJhdGlvbiB0aW1lcyBhbmQgd2UgdHJ5IHRvIHJlbGF5IHRoaXMgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2Ugc2VydmljZSBkaXNydXB0aW9uLiBUaGlzIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyB1cGRhdGUgbW9kZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19FWFBJUkFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIE1vc3QgcmVsZXZhbnQgZm9yIHBlcnNvbmFsIGZpbmFuY2UgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgQ1NWIGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyB0byBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgZnJvbSB0aGUgbGVnYWN5IGNhdGVnb3JpZXMsIGFsc28gcmVmZXIgdG8gdGhlIFtgbWlncmF0aW9uIGd1aWRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjYXRlZ29yaWVzIGFjY3VyYXRlbHkgZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uIGludGVudC4gIGBWRVJZX0hJR0hgOiBXZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgTE9XYDogVGhpcyBjYXRlZ29yeSBtYXkgcmVmbGVjdCB0aGUgaW50ZW50LCBidXQgdGhlcmUgbWF5IGJlIG90aGVyIGNhdGVnb3JpZXMgdGhhdCBhcmUgbW9yZSBhY2N1cmF0ZS4gYFVOS05PV05gOiBXZSBkb27igJl0IGtub3cgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBwaG9uZSBudW1iZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgcGhvbmUgbnVtYmVyIGFzIHRoZSBwcmltYXJ5IG51bWJlciBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogUGhvbmVOdW1iZXJUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQaG9uZU51bWJlclR5cGVFbnVtIHtcbiAgICBIb21lID0gJ2hvbWUnLFxuICAgIFdvcmsgPSAnd29yaycsXG4gICAgT2ZmaWNlID0gJ29mZmljZScsXG4gICAgTW9iaWxlID0gJ21vYmlsZScsXG4gICAgTW9iaWxlMSA9ICdtb2JpbGUxJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBwaG9uZSBudW1iZXIgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBwaG9uZSBudW1iZXIgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBwaG9uZSBudW1iZXIuIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2gsIDk5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCAobWF0Y2hpbmcgdGhlIHNhbWUgcGhvbmUgbnVtYmVyIHdpdGggZXh0ZW5zaW9uIGFnYWluc3Qgb25lIHdpdGhvdXQgZXh0ZW5zaW9uLCBldGMuKSwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIHBob25lIG51bWJlciBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHBob25lIG51bWJlciBpcyBhIHBob25lIGxpbmUgb3IgYSBmYXggbGluZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBob25lVHlwZSB7XG4gICAgUGhvbmUgPSAncGhvbmUnLFxuICAgIEZheCA9ICdmYXgnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgZGV0ZWN0ZWQgaW4gdGhlIGltYWdlcyBwcm92aWRlZC4gV2lsbCBhbHdheXMgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICBgZHJpdmVyc19saWNlbnNlYCAtIEEgZHJpdmVyXFwncyBsaWNlbnNlIGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5LCBlc3RhYmxpc2hpbmcgaWRlbnRpdHkgd2l0aG91dCBhbnkgZ3VhcmFudGVlIGFzIHRvIGNpdGl6ZW5zaGlwLCBhbmQgZ3JhbnRpbmcgZHJpdmluZyBwcml2aWxlZ2VzICAgIGBpZF9jYXJkYCAtIEEgZ2VuZXJhbCBuYXRpb25hbCBpZGVudGlmaWNhdGlvbiBjYXJkLCBkaXN0aW5jdCBmcm9tIGRyaXZlclxcJ3MgbGljZW5zZXMgYXMgaXQgb25seSBlc3RhYmxpc2hlcyBpZGVudGl0eSAgICBgcGFzc3BvcnRgIC0gQSB0cmF2ZWwgcGFzc3BvcnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgZm9yIG9uZSBvZiBpdHMgY2l0aXplbnMgICAgYHJlc2lkZW5jZV9wZXJtaXRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT50ZW1wb3JhcmlseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgcmVzaWRlbnRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT5wZXJtYW5lbnRseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgdmlzYWAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIGVudHJ5IGZvciBhIHNob3J0IGR1cmF0aW9uIGFuZCBmb3IgYSBzcGVjaWZpYyBwdXJwb3NlLCB0eXBpY2FsbHkgbm8gbG9uZ2VyIHRoYW4gNiBtb250aHMgIE5vdGU6IFRoaXMgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBJRCB0eXBlIHRoYXQgdGhlIHVzZXIgc2VsZWN0cyB3aXRoaW4gTGluay4gRm9yIGV4YW1wbGUsIGlmIHRoZXkgc2VsZWN0IFxcXCJEcml2ZXJcXCdzIExpY2Vuc2VcXFwiIGJ1dCB0aGVuIHN1Ym1pdCBhIHBpY3R1cmUgb2YgYSBwYXNzcG9ydCwgdGhpcyBmaWVsZCB3aWxsIHNheSBgcGFzc3BvcnRgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnkge1xuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSWRDYXJkID0gJ2lkX2NhcmQnLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBSZXNpZGVuY2VQZXJtaXRDYXJkID0gJ3Jlc2lkZW5jZV9wZXJtaXRfY2FyZCcsXG4gICAgUmVzaWRlbnRDYXJkID0gJ3Jlc2lkZW50X2NhcmQnLFxuICAgIFZpc2EgPSAndmlzYSdcbn1cblxuLyoqXG4gKiBEYXRhIGV4dHJhY3RlZCBmcm9tIGEgdXNlci1zdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFscGhhLW51bWVyaWMgSUQgbnVtYmVyIGV4dHJhY3RlZCB2aWEgT0NSIGZyb20gdGhlIHVzZXJcXCdzIGRvY3VtZW50IGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaXNzdWluZ19yZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHRoZSBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBzdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnROYW1lTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogRG9jdW1lbnROYW1lTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXhwaXJhdGlvbkRhdGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IEV4cGlyYXRpb25EYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1aW5nQ291bnRyeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogSXNzdWluZ0NvdW50cnk7XG59XG4vKipcbiAqIFVSTHMgZm9yIGRvd25sb2FkaW5nIG9yaWdpbmFsIGFuZCBjcm9wcGVkIGltYWdlcyBmb3IgdGhpcyBkb2N1bWVudCBzdWJtaXNzaW9uLiBUaGUgVVJMcyBhcmUgZGVzaWduZWQgdG8gb25seSBhbGxvdyBkb3dubG9hZGluZywgbm90IGhvdCBsaW5raW5nLCBzbyB0aGUgVVJMIHdpbGwgb25seSBzZXJ2ZSB0aGUgZG9jdW1lbnQgaW1hZ2UgZm9yIDYwIHNlY29uZHMgYmVmb3JlIGV4cGlyaW5nLiBUaGUgZXhwaXJhdGlvbiB0aW1lIGlzIDYwIHNlY29uZHMgYWZ0ZXIgdGhlIGBHRVRgIHJlcXVlc3QgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiBBIG5ldyBleHBpcmluZyBVUkwgaXMgZ2VuZXJhdGVkIHdpdGggZWFjaCByZXF1ZXN0LCBzbyB5b3UgY2FuIGFsd2F5cyByZXJlcXVlc3QgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlmIG9uZSBvZiB5b3VyIFVSTHMgZXhwaXJlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEltYWdlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIHRoZSB1bmNyb3BwZWQgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGZyb250IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudC4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQgd2FzIG5vdCBjb2xsZWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIG9yaWdpbmFsX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2Zyb250OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcHBlZCBpbWFnZSBjb250YWluaW5nIGp1c3QgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgY3JvcHBlZF9iYWNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcCBvZiBqdXN0IHRoZSB1c2VyXFwncyBmYWNlIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLiBNaWdodCBiZSBudWxsIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIGEgZmFjZSBwaG90by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgZmFjZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogV2UgdXNlIHN0YW5kYXJkIEhUVFAgcmVzcG9uc2UgY29kZXMgZm9yIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbm90aWZpY2F0aW9ucywgYW5kIG91ciBlcnJvcnMgYXJlIGZ1cnRoZXIgY2xhc3NpZmllZCBieSBgZXJyb3JfdHlwZWAuIEluIGdlbmVyYWwsIDIwMCBIVFRQIGNvZGVzIGNvcnJlc3BvbmQgdG8gc3VjY2VzcywgNDBYIGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZmFpbHVyZXMsIGFuZCA1MFggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGlzc3Vlcy4gQW4gSXRlbSB3aXRoIGEgbm9uLWBudWxsYCBlcnJvciBvYmplY3Qgd2lsbCBvbmx5IGJlIHBhcnQgb2YgYW4gQVBJIHJlc3BvbnNlIHdoZW4gY2FsbGluZyBgL2l0ZW0vZ2V0YCB0byB2aWV3IEl0ZW0gc3RhdHVzLiBPdGhlcndpc2UsIGVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQ7IGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZCwgYW4gZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBsYWlkRXJyb3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBsYWlkRXJyb3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBQbGFpZEVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVxdWVzdCwgdG8gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzLiBUaGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZCBpbiBlcnJvcnMgcHJvdmlkZWQgYnkgd2ViaG9va3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhlIEFzc2V0cyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGNhdXNlcz86IEFycmF5PGFueT47XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4gVGhpcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgd2hlbiB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIGEgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgUGxhaWQgZG9jdW1lbnRhdGlvbiBwYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHN1Z2dlc3RlZF9hY3Rpb24/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBsYWlkRXJyb3JUeXBlIHtcbiAgICBJbnZhbGlkUmVxdWVzdCA9ICdJTlZBTElEX1JFUVVFU1QnLFxuICAgIEludmFsaWRSZXN1bHQgPSAnSU5WQUxJRF9SRVNVTFQnLFxuICAgIEludmFsaWRJbnB1dCA9ICdJTlZBTElEX0lOUFVUJyxcbiAgICBJbnN0aXR1dGlvbkVycm9yID0gJ0lOU1RJVFVUSU9OX0VSUk9SJyxcbiAgICBSYXRlTGltaXRFeGNlZWRlZCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICBBcGlFcnJvciA9ICdBUElfRVJST1InLFxuICAgIEl0ZW1FcnJvciA9ICdJVEVNX0VSUk9SJyxcbiAgICBBc3NldFJlcG9ydEVycm9yID0gJ0FTU0VUX1JFUE9SVF9FUlJPUicsXG4gICAgUmVjYXB0Y2hhRXJyb3IgPSAnUkVDQVBUQ0hBX0VSUk9SJyxcbiAgICBPYXV0aEVycm9yID0gJ09BVVRIX0VSUk9SJyxcbiAgICBQYXltZW50RXJyb3IgPSAnUEFZTUVOVF9FUlJPUicsXG4gICAgQmFua1RyYW5zZmVyRXJyb3IgPSAnQkFOS19UUkFOU0ZFUl9FUlJPUicsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uRXJyb3IgPSAnSU5DT01FX1ZFUklGSUNBVElPTl9FUlJPUicsXG4gICAgTWljcm9kZXBvc2l0c0Vycm9yID0gJ01JQ1JPREVQT1NJVFNfRVJST1InXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBzZXQgb2YgaWRzIHJlbGF0ZWQgdG8gYW4gZW1wbG95ZWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhdGZvcm1JZHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtSWRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQcm9jZXNzb3JOdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgdGhlIGJhbGFuY2UgdGhhdCBpcyBwdWxsZWQgZm9yIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSksIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50IOKAkyBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkIGFuZCBQbGFpZCBoYXMgcHJlcGFyZWQgYXMgbXVjaCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIGRhdGEgYXMgcG9zc2libGUgZm9yIHRoZSBJdGVtLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBiZXlvbmQgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBJZiBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkgaXMgZW5hYmxlZCwgdGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldywgdW5mZXRjaGVkIHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eU1hdGNoVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogSWRlbnRpdHlNYXRjaFVzZXI7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBpbml0aWFsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBJZiBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkgaXMgZW5hYmxlZCwgdGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOSVRJQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpZGVudGlmeWluZyBudW1iZXJzIHVzZWQgZm9yIG1ha2luZyBlbGVjdHJvbmljIHRyYW5zZmVycyB0byBhbmQgZnJvbSB0aGUgYGFjY291bnRgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSB0aGUgYGFjY291bnRgIGZvciB3aGljaCBhdXRoIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkLCBhIG51bGwgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTnVtYmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0FDSE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBhY2g/OiBOdW1iZXJzQUNITnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzRUZUTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGVmdD86IE51bWJlcnNFRlROdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0JBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYmFjcz86IE51bWJlcnNCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWF0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFjdHVhbCBudW1iZXIgb2YgZGF5cyAoaG9sZCB0aW1lKSBzaW5jZSB0aGUgQUNIIGRlYml0IHRyYW5zYWN0aW9uIHRoYXQgeW91IHdhaXQgYmVmb3JlIG1ha2luZyBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMuIFRoZSBob2xkaW5nIHRpbWUgY291bGQgYWZmZWN0IHRoZSBBQ0ggcmV0dXJuIHJhdGUuICBGb3IgZXhhbXBsZSwgdXNlIDAgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBvciB0aGUgc2FtZSBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbiwgb3IgMSBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdGhlIG5leHQgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19mdW5kc19vbl9ob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGVjaXNpb25PdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9vdXRjb21lPzogU2lnbmFsRGVjaXNpb25PdXRjb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGF5bWVudE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q/OiBTaWduYWxQYXltZW50TWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IChpbiBVU0QpIG1hZGUgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLiBJdCBjb3VsZCBiZSBhIHBhcnRpYWwgYW1vdW50IG9mIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24gKGV4YW1wbGU6IDEwMi4wNSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50X2luc3RhbnRseV9hdmFpbGFibGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICoqdHJ1ZSoqIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gaXMgYSByZWN1cnJpbmcgdHJhbnNhY3Rpb247ICoqZmFsc2UqKiBvdGhlcndpc2UgXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOQUNIQS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSBgUkVBTF9USU1FX1BBWU1FTlRTYDogcmVhbC10aW1lIHBheW1lbnRzIHN1Y2ggYXMgUlRQIGFuZCBGZWROb3cgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29yZV9hdHRyaWJ1dGVzPzogU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcztcbiAgICAvKipcbiAgICAgKiBJZiBiYW5rIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gdGhlIFNpZ25hbCBtb2RlbCwgdGhpcyBhcnJheSBjb250YWlucyB3YXJuaW5ncyBkZXNjcmliaW5nIHdoeSBiYW5rIGRhdGEgaXMgbWlzc2luZy4gSWYgeW91IHdhbnQgdG8gcmVjZWl2ZSBhbiBBUEkgZXJyb3IgaW5zdGVhZCBvZiBTaWduYWwgc2NvcmVzIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgYmFuayBkYXRhLCBmaWxlIGEgc3VwcG9ydCB0aWNrZXQgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2lnbmFsV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5fY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmV0dXJucyBmcm9tIHlvdXIgcGF5bWVudCBwcm9jZXNzb3JzLCBpbiBJU08gODYwMSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5lZF9hdD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNlbnQgdG8gU3RyaXBlIGZvciB1c2UgaW4gbWFraW5nIEFQSSBjYWxscyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmlwZV9iYW5rX2FjY291bnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIGNoYW5nZS4gVGhpcyBjYW4gYmUgZHVlIHRvIGFueSBldmVudCByZXN1bHRpbmcgaW4gbmV3IGNoYW5nZXMsIHN1Y2ggYXMgYW4gaW5pdGlhbCAzMC1kYXkgdHJhbnNhY3Rpb25zIGZldGNoIHVwb24gdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuIEl0ZW0gd2l0aCB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZmlsbCBvZiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyB0aGF0IG9jY3VycyBzaG9ydGx5IGFmdGVyLCBvciB3aGVuIGNoYW5nZXMgYXJlIHBvcHVsYXRlZCBmcm9tIGEgcmVndWxhcmx5LXNjaGVkdWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGpvYi4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgd2hlbiB1c2luZyB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LiBOb3RlIHRoYXQgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCB3aWxsIGFsc28gY29udGludWUgdG8gYmUgc2VudCBpbiBvcmRlciB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRob3NlIHdlYmhvb2tzIHdoZW4gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSBuZXcgY2hhbmdlcyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0gZnJvbSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBvbiB0aGF0IEl0ZW0uIFRoaXMgbWVhbnMgdGhhdCwgdW5saWtlIHRoZSBgSU5JVElBTF9VUERBVEVgIGFuZCBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2tzLCBpdCB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gSXRlbSBjcmVhdGlvbi4gSWYgYC90cmFuc2FjdGlvbnMvc3luY2AgaXMgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCB3YXMgKm5vdCogaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMsIHRoZSB3ZWJob29rIHdpbGwgZmlyZSB0d2ljZTogb25jZSB0aGUgZmlyc3QgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLCBhbmQgYSBzZWNvbmQgdGltZSB3aGVuIGFsbCBhdmFpbGFibGUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLiAgVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyB0cmFuc2FjdGlvbnMgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5pdGlhbCBwdWxsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaW5pdGlhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGhpc3RvcmljYWwgcHVsbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgeW91IGFyZSBpbnRlZ3JhdGluZyB3aXRoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0UHJvY2Vzc29yRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtIHtcbiAgICBEd29sbGEgPSAnZHdvbGxhJyxcbiAgICBHYWxpbGVvID0gJ2dhbGlsZW8nLFxuICAgIE1vZGVyblRyZWFzdXJ5ID0gJ21vZGVybl90cmVhc3VyeScsXG4gICAgT2Nyb2x1cyA9ICdvY3JvbHVzJyxcbiAgICBQcmltZVRydXN0ID0gJ3ByaW1lX3RydXN0JyxcbiAgICBWZXN0YSA9ICd2ZXN0YScsXG4gICAgRHJpdmV3ZWFsdGggPSAnZHJpdmV3ZWFsdGgnLFxuICAgIFZvcGF5ID0gJ3ZvcGF5JyxcbiAgICBBY2hxID0gJ2FjaHEnLFxuICAgIENoZWNrID0gJ2NoZWNrJyxcbiAgICBDaGVja2Jvb2sgPSAnY2hlY2tib29rJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaWxhTW9uZXkgPSAnc2lsYV9tb25leScsXG4gICAgUml6ZSA9ICdyaXplJyxcbiAgICBTdmJBcGkgPSAnc3ZiX2FwaScsXG4gICAgVW5pdCA9ICd1bml0JyxcbiAgICBXeXJlID0gJ3d5cmUnLFxuICAgIExpdGhpYyA9ICdsaXRoaWMnLFxuICAgIEFscGFjYSA9ICdhbHBhY2EnLFxuICAgIEFzdHJhID0gJ2FzdHJhJyxcbiAgICBNb292ID0gJ21vb3YnLFxuICAgIFRyZWFzdXJ5UHJpbWUgPSAndHJlYXN1cnlfcHJpbWUnLFxuICAgIE1hcnFldGEgPSAnbWFycWV0YScsXG4gICAgQ2hlY2tvdXQgPSAnY2hlY2tvdXQnLFxuICAgIFNvbGlkID0gJ3NvbGlkJyxcbiAgICBIaWdobm90ZSA9ICdoaWdobm90ZScsXG4gICAgR2VtaW5pID0gJ2dlbWluaScsXG4gICAgQXBleENsZWFyaW5nID0gJ2FwZXhfY2xlYXJpbmcnLFxuICAgIEd1c3RvID0gJ2d1c3RvJyxcbiAgICBBZHllbiA9ICdhZHllbicsXG4gICAgQXRvbWljID0gJ2F0b21pYycsXG4gICAgSTJjID0gJ2kyYycsXG4gICAgV2VwYXkgPSAnd2VwYXknLFxuICAgIFJpc2tpZmllZCA9ICdyaXNraWZpZWQnLFxuICAgIFV0YiA9ICd1dGInLFxuICAgIEFkcFJvbGwgPSAnYWRwX3JvbGwnLFxuICAgIEZvcnRyZXNzVHJ1c3QgPSAnZm9ydHJlc3NfdHJ1c3QnLFxuICAgIEJvbmQgPSAnYm9uZCcsXG4gICAgQmFra3QgPSAnYmFra3QnLFxuICAgIFRlYWwgPSAndGVhbCcsXG4gICAgWmVyb0hhc2ggPSAnemVyb19oYXNoJyxcbiAgICBUYWJhUGF5ID0gJ3RhYmFfcGF5JyxcbiAgICBLbm90ID0gJ2tub3QnLFxuICAgIFNhcmRpbmUgPSAnc2FyZGluZScsXG4gICAgQWxsb3kgPSAnYWxsb3knXG59XG5cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWAgYW5kIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvY2Vzc29yX3Rva2VuYCB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgYnkgdGhlIFBsYWlkIHBhcnRuZXIgdG8gbWFrZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGUgcHJvY2Vzc29yIHRva2VuIHNob3VsZCBoYXZlIGFjY2VzcyB0by4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGF0IHRoZSBwcm9jZXNzb3IgaGFzIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBpbmNsdWRpbmcgZnV0dXJlIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9zZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IHdpbGwgZ3JhbnQgYWNjZXNzIHRvIGFsbCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYSBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgd2ViaG9vayBVUkwgZm9yIGEgcHJvY2Vzc29yIHRva2VuIHZpYSBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFBST0NFU1NPUl9UT0tFTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYSBwcm9jZXNzb3IgdG9rZW4sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgZmllbGQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgcGFyc2VkIGRhdGEgcHJvdmlkZWQsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIsIG9yIHN1Ym1pdCBhIFtTdXBwb3J0IHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9wcm9kdWN0LWZ1bmN0aW9uYWxpdHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9sb2dvX2FuZF9jb3VudGVycGFydHlfYmV0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFByb3ZpZGluZyBpdCB3aWxsIGNhdXNlIHRoZSByZXNwb25zZSB0byBvbmx5IHJldHVybiBjaGFuZ2VzIGFmdGVyIHRoaXMgdXBkYXRlLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgdXBkYXRlcyB3aWxsIGJlIHJldHVybmVkLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdC1hZGRlZCB0cmFuc2FjdGlvbnMgb24gdGhlIGl0ZW0uIE5vdGU6IFRoZSB1cHBlci1ib3VuZCBsZW5ndGggb2YgdGhpcyBjdXJzb3IgaXMgMjU2IGNoYXJhY3RlcnMgb2YgYmFzZTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyBleGlzdC4gSWYgdHJ1ZSwgdGhlIGFkZGl0aW9uYWwgdXBkYXRlcyBjYW4gYmUgZmV0Y2hlZCBieSBtYWtpbmcgYW4gYWRkaXRpb25hbCByZXF1ZXN0IHdpdGggYGN1cnNvcmAgc2V0IHRvIGBuZXh0X2N1cnNvcmAuIElmIGBoYXNfbW9yZWAgaXMgdHJ1ZSwgaXTigJlzIGltcG9ydGFudCB0byBwdWxsIGFsbCBhdmFpbGFibGUgcGFnZXMsIHRvIG1ha2UgaXQgbGVzcyBsaWtlbHkgZm9yIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VzIHRvIGNvbmZsaWN0IHdpdGggcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHByb2R1Y3QgYWNjZXNzIGJlaW5nIHJlcXVlc3RlZC4gVXNlZCB0byBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBhY3Jvc3MgYWxsIGFjY291bnRzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYWxsIHByb2R1Y3RzIGFsbG93ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0aGUgSWRlbnRpdHkgcHJvZHVjdCAobmFtZSwgZW1haWwsIHBob25lLCBhZGRyZXNzKS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gYWNjb3VudCBudW1iZXIgZGV0YWlscy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0cmFuc2FjdGlvbiBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX2RldGFpbHNfdHJhbnNhY3Rpb25zXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3JvdXRpbmdfbnVtYmVyXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfcm91dGluZ19udW1iZXI/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3N0YXRlbWVudHNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19zdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIFxcXCJhY2NvdW50c190YXhfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3RheF9zdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIFxcXCJjdXN0b21lcnNfcHJvZmlsZXNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBjdXN0b21lcnNfcHJvZmlsZXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIEF1dGguIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgcHV0dGluZyB0aGUgdXNlciB0aHJvdWdoIHVwZGF0ZSBtb2RlIHdpdGggYGF1dGhgIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIGxpbWl0ZWQgYmV0YSBmb3IgdXBkYXRlIG1vZGUgQXV0aGVudGljYXRpb24gcHJvZHVjdCB2YWxpZGF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gYEFDQ0VTU19OT1RfR1JBTlRFRGAgZXJyb3IgaXMgaGl0IGZvciBJZGVudGl0eS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgaWRlbnRpdHlgIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIGxpbWl0ZWQgYmV0YSBmb3IgdXBkYXRlIG1vZGUgSWRlbnRpdHkgcHJvZHVjdCB2YWxpZGF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUEVSTUlTU0lPTlNfUkVRVUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0dXMgaGVhbHRoIG9mIGEgcmVxdWVzdCB0eXBlLiBBdXRoIHJlcXVlc3RzLCBCYWxhbmNlIHJlcXVlc3RzLCBJZGVudGl0eSByZXF1ZXN0cywgSW52ZXN0bWVudHMgcmVxdWVzdHMsIExpYWJpbGl0aWVzIHJlcXVlc3RzLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgYW5kIEl0ZW0gbG9naW5zIGVhY2ggaGF2ZSB0aGVpciBvd24gc3RhdHVzIG9iamVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYGJyZWFrZG93bmAgb2JqZWN0LCB3aGljaCBwcm92aWRlcyBtb3JlIGdyYW51bGFyIGluc3RpdHV0aW9uIGhlYWx0aCBkYXRhLiAgYEhFQUxUSFlgOiB0aGUgbWFqb3JpdHkgb2YgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERFR1JBREVEYDogb25seSBzb21lIHJlcXVlc3RzIGFyZSBzdWNjZXNzZnVsIGBET1dOYDogYWxsIHJlcXVlc3RzIGFyZSBmYWlsaW5nXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3RhdHVzOiBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXR0ZWQgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN0YXR1cyBjaGFuZ2UgZm9yIHRoZSBpbnN0aXR1dGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX2NoYW5nZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzQnJlYWtkb3dufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtIHtcbiAgICBIZWFsdGh5ID0gJ0hFQUxUSFknLFxuICAgIERlZ3JhZGVkID0gJ0RFR1JBREVEJyxcbiAgICBEb3duID0gJ0RPV04nXG59XG5cbi8qKlxuICogQSBkZXRhaWxlZCBicmVha2Rvd24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBwZXJmb3JtYW5jZSBmb3IgYSByZXF1ZXN0IHR5cGUuIFRoZSB2YWx1ZXMgZm9yIGBzdWNjZXNzYCwgYGVycm9yX3BsYWlkYCwgYW5kIGBlcnJvcl9pbnN0aXR1dGlvbmAgc3VtIHRvIDEuIFRoZSB0aW1lIHJhbmdlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBicmVha2Rvd24gbWF5IHJhbmdlIGZyb20gdGhlIG1vc3QgcmVjZW50IGZldyBtaW51dGVzIHRvIHRoZSBwYXN0IHNpeCBob3Vycy4gSW4gZ2VuZXJhbCwgc21hbGxlciBpbnN0aXR1dGlvbnMgd2lsbCBzaG93IHN0YXR1cyB0aGF0IHdhcyBjYWxjdWxhdGVkIG92ZXIgYSBsb25nZXIgcGVyaW9kIG9mIHRpbWUuIEZvciBJbnZlc3RtZW50IHVwZGF0ZXMsIHdoaWNoIGFyZSByZWZyZXNoZWQgbGVzcyBmcmVxdWVudGx5LCB0aGUgcGVyaW9kIGFzc2Vzc2VkIG1heSBiZSAyNCBob3VycyBvciBtb3JlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0luc3RpdHV0aW9uIHN0YXR1cyBkZXRhaWxzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI2luc3RpdHV0aW9uLXN0YXR1cy1kZXRhaWxzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2luIGF0dGVtcHRzIHRoYXQgYXJlIHN1Y2Nlc3NmdWwsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHN1Y2Nlc3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbnMgdGhhdCBhcmUgZmFpbGluZyBkdWUgdG8gYW4gaW50ZXJuYWwgUGxhaWQgaXNzdWUsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9wbGFpZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpc3N1ZSBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIHN5c3RlbSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgZXJyb3JfaW5zdGl0dXRpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlZnJlc2hfaW50ZXJ2YWxgIG1heSBiZSBgREVMQVlFRGAgb3IgYFNUT1BQRURgIGV2ZW4gd2hlbiB0aGUgc3VjY2VzcyByYXRlIGlzIGhpZ2guIFRoaXMgdmFsdWUgaXMgb25seSByZXR1cm5lZCBmb3IgVHJhbnNhY3Rpb25zIHN0YXR1cyBicmVha2Rvd25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICByZWZyZXNoX2ludGVydmFsPzogUHJvZHVjdFN0YXR1c0JyZWFrZG93blJlZnJlc2hJbnRlcnZhbEVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c0JyZWFrZG93blJlZnJlc2hJbnRlcnZhbEVudW0ge1xuICAgIE5vcm1hbCA9ICdOT1JNQUwnLFxuICAgIERlbGF5ZWQgPSAnREVMQVlFRCcsXG4gICAgU3RvcHBlZCA9ICdTVE9QUEVEJ1xufVxuXG4vKipcbiAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGFuIGluc3RpdHV0aW9uIGNhbiBzdXBwb3J0LiBBbGwgSXRlbXMgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiBUaGUgQmFsYW5jZSBwcm9kdWN0IGlzIGFsd2F5cyBhdmFpbGFibGUgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgc3BlY2lmaWVkIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RzIHtcbiAgICBBc3NldHMgPSAnYXNzZXRzJyxcbiAgICBBdXRoID0gJ2F1dGgnLFxuICAgIEJhbGFuY2UgPSAnYmFsYW5jZScsXG4gICAgSWRlbnRpdHkgPSAnaWRlbnRpdHknLFxuICAgIElkZW50aXR5TWF0Y2ggPSAnaWRlbnRpdHlfbWF0Y2gnLFxuICAgIEludmVzdG1lbnRzID0gJ2ludmVzdG1lbnRzJyxcbiAgICBJbnZlc3RtZW50c0F1dGggPSAnaW52ZXN0bWVudHNfYXV0aCcsXG4gICAgTGlhYmlsaXRpZXMgPSAnbGlhYmlsaXRpZXMnLFxuICAgIFBheW1lbnRJbml0aWF0aW9uID0gJ3BheW1lbnRfaW5pdGlhdGlvbicsXG4gICAgSWRlbnRpdHlWZXJpZmljYXRpb24gPSAnaWRlbnRpdHlfdmVyaWZpY2F0aW9uJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAndHJhbnNhY3Rpb25zJyxcbiAgICBDcmVkaXREZXRhaWxzID0gJ2NyZWRpdF9kZXRhaWxzJyxcbiAgICBJbmNvbWUgPSAnaW5jb21lJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb24gPSAnaW5jb21lX3ZlcmlmaWNhdGlvbicsXG4gICAgRGVwb3NpdFN3aXRjaCA9ICdkZXBvc2l0X3N3aXRjaCcsXG4gICAgU3RhbmRpbmdPcmRlcnMgPSAnc3RhbmRpbmdfb3JkZXJzJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgRW1wbG95bWVudCA9ICdlbXBsb3ltZW50JyxcbiAgICBSZWN1cnJpbmdUcmFuc2FjdGlvbnMgPSAncmVjdXJyaW5nX3RyYW5zYWN0aW9ucycsXG4gICAgU2lnbmFsID0gJ3NpZ25hbCcsXG4gICAgU3RhdGVtZW50cyA9ICdzdGF0ZW1lbnRzJ1xufVxuXG4vKipcbiAqIFRoZSB2YWxpZCBuYW1lIG1hdGNoaW5nIHNlbnNpdGl2aXR5IGNvbmZpZ3VyYXRpb25zIGZvciBhIHNjcmVlbmluZyBwcm9ncmFtLiBOb3RlIHRoYXQgd2hpbGUgY2VydGFpbiBtYXRjaGluZyB0ZWNobmlxdWVzIG1heSBiZSBtb3JlIHByZXZhbGVudCBvbiBsZXNzIHN0cmljdCBzZXR0aW5ncywgYWxsIG1hdGNoaW5nIGFsZ29yaXRobXMgYXJlIGVuYWJsZWQgZm9yIGV2ZXJ5IHNlbnNpdGl2aXR5LiAgYGNvYXJzZWAgLSBTZWUgbW9yZSBwb3RlbnRpYWwgbWF0Y2hlcy4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIHNlZSBtb3JlIGJyb2FkIHBob25ldGljIG1hdGNoZXMgYWNyb3NzIGFscGhhYmV0cyB0aGF0IG1ha2UgbWlzc2luZyBhIHBvdGVudGlhbCBoaXQgdmVyeSB1bmxpa2VseS4gVGhpcyBzZXR0aW5nIGlzIG5vaXNpZXIgYW5kIHdpbGwgcmVxdWlyZSBtb3JlIG1hbnVhbCByZXZpZXcuICBgYmFsYW5jZWRgIC0gQSBnb29kIGRlZmF1bHQgZm9yIG1vc3QgY29tcGFuaWVzLiBUaGlzIHNlbnNpdGl2aXR5IGlzIGJhbGFuY2VkIHRvIHNob3cgaGlnaCBxdWFsaXR5IGhpdHMgd2l0aCByZWR1Y2VkIG5vaXNlLiAgYHN0cmljdGAgLSBBZ2dyZXNzaXZlIGZhbHNlIHBvc2l0aXZlIHJlZHVjdGlvbi4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIHJlcXVpcmUgbmFtZXMgdG8gYmUgbW9yZSBzaW1pbGFyIHRoYW4gYGNvYXJzZWAgYW5kIGBiYWxhbmNlZGAgc2V0dGluZ3MsIHJlbHlpbmcgbGVzcyBvbiBwaG9uZXRpY3MsIHdoaWxlIHN0aWxsIGFjY291bnRpbmcgZm9yIGNoYXJhY3RlciB0cmFuc3Bvc2l0aW9ucywgbWlzc2luZyB0b2tlbnMsIGFuZCBvdGhlciBjb21tb24gcGVybXV0YXRpb25zLiAgYGV4YWN0YCAtIE1hdGNoZXMgbXVzdCBiZSBuZWFybHkgZXhhY3QuIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCBvbmx5IHNob3cgaGl0cyB3aXRoIGV4YWN0IG9yIG5lYXJseSBleGFjdCBuYW1lIG1hdGNoZXMgd2l0aCBvbmx5IGJhc2ljIGNvcnJlY3Rpb24gc3VjaCBhcyBleHRyYW5lb3VzIHN5bWJvbHMgYW5kIGNhcGl0YWxpemF0aW9uLiBUaGlzIHNldHRpbmcgaXMgZ2VuZXJhbGx5IG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGhhdmUgYSB2ZXJ5IHNwZWNpZmljIHVzZSBjYXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZ3JhbU5hbWVTZW5zaXRpdml0eSB7XG4gICAgQ29hcnNlID0gJ2NvYXJzZScsXG4gICAgQmFsYW5jZWQgPSAnYmFsYW5jZWQnLFxuICAgIFN0cmljdCA9ICdzdHJpY3QnLFxuICAgIEV4YWN0ID0gJ2V4YWN0J1xufVxuXG4vKipcbiAqIFRoZSBlbXBsb3llZVxcJ3MgZXN0aW1hdGVkIGFubnVhbCBzYWxhcnksIGFzIGRlcml2ZWQgZnJvbSBpbmZvcm1hdGlvbiByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgbmV0d29yayBwcm94eSBpcyBwcmVzZW50IGFuZCBpZiBzbyB3aGF0IHR5cGUgaXQgaXMuICBgbm9uZV9kZXRlY3RlZGAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG5vdCBvbiBhIGRldGVjdGFibGUgcHJveHkgbmV0d29yay4gIGB0b3JgIGluZGljYXRlcyB0aGUgdXNlciB3YXMgdXNpbmcgYSBUb3IgYnJvd3Nlciwgd2hpY2ggc2VuZHMgZW5jcnlwdGVkIHRyYWZmaWMgb24gYSBkZWNlbnRyYWxpemVkIG5ldHdvcmsgYW5kIGlzIHNvbWV3aGF0IHNpbWlsYXIgdG8gYSBWUE4gKFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrKS4gIGB2cG5gIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspICBgd2ViX3Byb3h5YCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgb24gYSB3ZWIgcHJveHkgc2VydmVyLCB3aGljaCBtYXkgYWxsb3cgdGhlbSB0byBjb25jZWFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlaXIgSVAgYWRkcmVzcyBvciBvdGhlciBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gIGBwdWJsaWNfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHB1YmxpYyB3ZWIgcHJveHkgc2VydmVyLCB3aGljaCBpcyBzaW1pbGFyIHRvIGEgd2ViIHByb3h5IGJ1dCBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIHVzZXJzLiBUaGlzIG1heSBhbGxvdyBtdWx0aXBsZSB1c2VycyB0byBhcHBlYXIgYXMgaWYgdGhleSBoYXZlIHRoZSBzYW1lIElQIGFkZHJlc3MgZm9yIGluc3RhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJveHlUeXBlIHtcbiAgICBOb25lRGV0ZWN0ZWQgPSAnbm9uZV9kZXRlY3RlZCcsXG4gICAgVG9yID0gJ3RvcicsXG4gICAgVnBuID0gJ3ZwbicsXG4gICAgV2ViUHJveHkgPSAnd2ViX3Byb3h5JyxcbiAgICBQdWJsaWNQcm94eSA9ICdwdWJsaWNfcHJveHknXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3Qgd2FzIGZsYWdnZWQgYnkgUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSwgYW5kIHJlcXVpcmVzIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIHRvIGVuc3VyZSB0aGV5IGFyZSBub3QgYSBib3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBSRUNBUFRDSEFfRVJST1JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9SRVFVSVJFRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDQwMFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBodHRwX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byBzb2x2ZSBhIEdvb2dsZSByZUNBUFRDSEEgY2hhbGxlbmdlIGluIHRoZSBMaW5rIFJlY2FwdGNoYSBwYW5lLiBJZiB0aGV5IHNvbHZlIHRoZSBjaGFsbGVuZ2Ugc3VjY2Vzc2Z1bGx5LCB0aGUgdXNlclxcJ3MgcmVxdWVzdCBpcyByZXN1Ym1pdHRlZCBhbmQgdGhleSBhcmUgZGlyZWN0ZWQgdG8gdGhlIG5leHQgSXRlbSBjcmVhdGlvbiBzdGVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBsaW5rX3VzZXJfZXhwZXJpZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyBmcmF1ZCBzeXN0ZW0gZGV0ZWN0cyBhYnVzaXZlIHRyYWZmaWMgYW5kIGNvbnNpZGVycyBhIHZhcmlldHkgb2YgcGFyYW1ldGVycyB0aHJvdWdob3V0IEl0ZW0gY3JlYXRpb24gcmVxdWVzdHMuIFdoZW4gYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgcmlza3kgb3IgcG9zc2libHkgZnJhdWR1bGVudCwgTGluayBwcmVzZW50cyBhIHJlQ0FQVENIQSBmb3IgdGhlIHVzZXIgdG8gc29sdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGNvbW1vbl9jYXVzZXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaW5rIHdpbGwgYXV0b21hdGljYWxseSBndWlkZSB5b3VyIHVzZXIgdGhyb3VnaCByZUNBUFRDSEEgdmVyaWZpY2F0aW9uLiBBcyBhIGdlbmVyYWwgcnVsZSwgd2UgcmVjb21tZW5kIGluc3RydW1lbnRpbmcgYmFzaWMgZnJhdWQgbW9uaXRvcmluZyB0byBkZXRlY3QgYW5kIHByb3RlY3QgeW91ciB3ZWJzaXRlIGZyb20gc3BhbSBhbmQgYWJ1c2UuICBJZiB5b3VyIHVzZXIgY2Fubm90IHZlcmlmeSB0aGVpciBzZXNzaW9uLCBwbGVhc2Ugc3VibWl0IGEgU3VwcG9ydCB0aWNrZXQgd2l0aCB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiBgbGlua19zZXNzaW9uX2lkYCBvciBgcmVxdWVzdF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgdHJvdWJsZXNob290aW5nX3N0ZXBzOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQkFDUyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB5b3UgbmVlZCB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQkFDUyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB0aGlzIHJlY2lwaWVudCBuZWVkcyB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyByZWxhdGluZyB0byBleHBlbnNlcyBhbmQgZGVwb3NpdHMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIG9jY3VyIG9uIGEgc2NoZWR1bGVkIGJhc2lzLCBzdWNoIGFzIGJpd2Vla2x5LCBtb250aGx5LCBvciBhbm51YWxseS4gIENvbW1vbiBleGFtcGxlcyBpbmNsdWRlIGxvYW4gcGF5bWVudHMsIGJpbGwgcGF5bWVudHMsIHN1YnNjcmlwdGlvbnMsIGFuZCBwYXlyb2xsIGluY29tZS4gIFRoaXMgaXMgYSBiZXRhIGZpZWxkLCBhdmFpbGFibGUgdG8gYWxsIHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJlbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJlbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHRyYW5zYWN0aW9uIGlzIHBlcmlvZGljYWxseSByZWN1cnJpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmVuY2VcbiAgICAgKi9cbiAgICBpc19yZWN1cnJpbmc/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJlbmNlXG4gICAgICovXG4gICAgZnJlcXVlbmN5PzogUmVjdXJyaW5nRnJlcXVlbmN5IHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjYW5jZWxsZWQgYnkgUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfQ0FOQ0VMTEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBEQUlMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgZGF5LiAgYERZTkFNSUNgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IHZhcmllcyBpbiByZWN1cnJlbmNlIGZyZXF1ZW5jeS4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyBzdHJlYW1zIGluIHRoZSBnaWcgZWNvbm9teS4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBpc25cXCd0IHJlY3VycmluZyBpbiBuYXR1cmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZWN1cnJpbmdGcmVxdWVuY3kge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBBbm51YWxseSA9ICdBTk5VQUxMWScsXG4gICAgRGFpbHkgPSAnREFJTFknLFxuICAgIER5bmFtaWMgPSAnRFlOQU1JQycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluc2lnaHRzIG9iamVjdCBmb3IgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBzdHJlYW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQtcHJvdmlkZWQgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG9yIHByaW1hcnkgY291bnRlcnBhcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGVhY2ggb2YgdGhlIHJlY3VycmluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2RheXNfYXBhcnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgZnJlcXVlbmN5PzogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgaW4gdGhpcyBzdHJlYW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCB0cmFuc2FjdGlvbiBJRHMgYmVsb25naW5nIHRvIHRoZSBzdHJlYW0sIHNvcnRlZCBieSBwb3N0ZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudD86IFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbSBpcyBzdGlsbCBsaXZlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGlzX2FjdGl2ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RhdHVzPzogVHJhbnNhY3Rpb25TdHJlYW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ByaW1hcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGFpbGVkIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9kZXRhaWxlZD86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIG5ldyB0cmFuc2ZlciBvZiBhIHJlY3VycmluZyB0cmFuc2ZlciBpcyBvcmlnaW5hdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX05FV19UUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdOZXdUcmFuc2ZlcldlYmhvb2tcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uICBgV0VFS0xZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB3ZWVrLiAgYEJJV0VFS0xZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSAyIHdlZWtzLiAgYFNFTUlfTU9OVEhMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgdHdpY2UgcGVyIG1vbnRoLiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHRyYW5zYWN0aW9uIHN0cmVhbXMuICBgTU9OVEhMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgbW9udGguICBgQU5OVUFMTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHllYXIuICBgVU5LTk9XTmA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgZG9lcyBub3QgZml0IGFueSBvZiB0aGUgcHJlLWRlZmluZWQgZnJlcXVlbmNpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJ1xufVxuXG4vKipcbiAqIEluc2lnaHRzIG9iamVjdCBmb3IgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZW5kcG9pbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcyAoZS5nLiwgaW5jb21lKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG91dGZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcyAoZS5nLiwgc3Vic2NyaXB0aW9ucywgYmlsbHMsIGxvYW4gcGF5bWVudHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8UmVjdXJyaW5nSW5zaWdodHNTdHJlYW0+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YSBpcyB1cGRhdGVkLiBUaGlzIGluY2x1ZGVzIHdoZW4gYSBuZXcgcmVjdXJyaW5nIHN0cmVhbSBpcyBkZXRlY3RlZCBvciB3aGVuIGEgbmV3IHRyYW5zYWN0aW9uIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHJlY3VycmluZyBzdHJlYW0uIFRoZSBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgIHdlYmhvb2sgd2lsbCBhbHNvIGZpcmUgd2hlbiBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWN1cnJpbmcgc3RyZWFtIGNoYW5nZXMsIHdoaWNoIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLCB1cGRhdGUsIG9yIHJlbW92YWwgb2YgdHJhbnNhY3Rpb25zIHRvIHRoZSBzdHJlYW0uICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIHVwZGF0ZWQgZGF0YSBjYW4gYmUgZmV0Y2hlZCBmcm9tIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCBmb3IgYWNjb3VudHMgdGhhdCBoYXZlIG5ldyBvciB1cGRhdGVkIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuICBUaGUgbmV4dCB0cmFuc2ZlciBvcmlnaW5hdGlvbiBkYXRlIGFmdGVyIGJhbmsgaG9saWRheSBhZGp1c3RtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVyUmVjdXJyaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiAgVGhlIG5leHQgdHJhbnNmZXIgb3JpZ2luYXRpb24gZGF0ZSBhZnRlciBiYW5rIGhvbGlkYXkgYWRqdXN0bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIG9uIHRoZSBwbGFubmVkIGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNGRVJfU0tJUFBFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlX2NvZGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYW5uZWQgZGF0ZSBvbiB3aGljaCBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgc2tpcHBlZF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSByZW1vdmVkIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXBvcnQgdHlwZS4gSXQgY2FuIGJlIGBhc3NldGAuIEluY29tZSByZXBvcnQgdHlwZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmVwb3J0VHlwZSB7XG4gICAgQXNzZXQgPSAnYXNzZXQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBiZWhhdmlvcmAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrQmVoYXZpb3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0JlaGF2aW9yIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tCZWhhdmlvclxuICAgICAqL1xuICAgIHVzZXJfaW50ZXJhY3Rpb25zOiBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tCZWhhdmlvclxuICAgICAqL1xuICAgIGZyYXVkX3JpbmdfZGV0ZWN0ZWQ6IFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tCZWhhdmlvclxuICAgICAqL1xuICAgIGJvdF9kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsO1xufVxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHRoZSBvdXRjb21lIG9mIGEgYm90IGRldGVjdGlvbiBiZWhhdmlvciByaXNrIGNoZWNrLiAgYHllc2AgaW5kaWNhdGVzIHRoYXQgYXV0b21hdGVkIGFjdGl2aXR5IHdhcyBkZXRlY3RlZC4gIGBub2AgaW5kaWNhdGVzIHRoYXQgYXV0b21hdGVkIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yQm90RGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBmcmF1ZCByaW5nIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBkZXRlY3RlZC4gIGBub2AgaW5kaWNhdGVzIHRoYXQgZnJhdWQgcmluZyBhY3Rpdml0eSB3YXMgbm90IGRldGVjdGVkLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGVyZSB3YXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWwge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHRoZSBvdmVyYWxsIHVzZXIgaW50ZXJhY3Rpb24gc2lnbmFscyBvZiBhIGJlaGF2aW9yIHJpc2sgY2hlY2suIFRoaXMgdmFsdWUgcmVwcmVzZW50cyBob3cgZmFtaWxpYXIgdGhlIHVzZXIgaXMgd2l0aCB0aGUgcGVyc29uYWwgZGF0YSB0aGV5IHByb3ZpZGUsIGJhc2VkIG9uIGEgbnVtYmVyIG9mIHNpZ25hbHMgdGhhdCBhcmUgY29sbGVjdGVkIGR1cmluZyB0aGVpciBzZXNzaW9uLiAgYGdlbnVpbmVgIGluZGljYXRlcyB0aGUgdXNlciBoYXMgaGlnaCBmYW1pbGlhcml0eSB3aXRoIHRoZSBkYXRhIHRoZXkgYXJlIHByb3ZpZGluZywgYW5kIHRoYXQgZnJhdWQgaXMgdW5saWtlbHkuICBgbmV1dHJhbGAgaW5kaWNhdGVzIHNvbWUgc2lnbmFscyBhcmUgcHJlc2VudCBpbiBiZXR3ZWVuIGByaXNreWAgYW5kIGBnZW51aW5lYCwgYnV0IHRoZXJlIGFyZSBub3QgZW5vdWdoIGNsZWFyIHNpZ25hbHMgdG8gZGV0ZXJtaW5lIGFuIG91dGNvbWUuICBgcmlza3lgIGluZGljYXRlcyB0aGUgdXNlciBoYXMgbG93IGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyBsaWtlbHkuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIGlzIG5vdCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWwge1xuICAgIEdlbnVpbmUgPSAnZ2VudWluZScsXG4gICAgTmV1dHJhbCA9ICduZXV0cmFsJyxcbiAgICBSaXNreSA9ICdyaXNreScsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGByaXNrX2NoZWNrYCBzdGVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGJlaGF2aW9yOiBSaXNrQ2hlY2tCZWhhdmlvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZW1haWw6IFJpc2tDaGVja0VtYWlsIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrUGhvbmV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZTogUmlza0NoZWNrUGhvbmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHJlc3VsdCBzdW1tYXJ5IG9iamVjdHMgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBkZXZpY2VgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Umlza0NoZWNrRGV2aWNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGRldmljZXM6IEFycmF5PFJpc2tDaGVja0RldmljZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgaWRlbnRpdHlfYWJ1c2Vfc2lnbmFsczogUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHMgfCBudWxsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBkZXZpY2VgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRGV2aWNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJveHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9wcm94eV90eXBlOiBQcm94eVR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvdW50IG9mIHNwYW0gbGlzdHMgdGhlIElQIGFkZHJlc3MgaXMgYXNzb2NpYXRlZCB3aXRoIGlmIGtub3duLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3NwYW1fbGlzdF9jb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVVEMgb2Zmc2V0IG9mIHRoZSB0aW1lem9uZSBhc3NvY2lhdGVkIHdpdGggdGhlIElQIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfdGltZXpvbmVfb2Zmc2V0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIGBlbWFpbGAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrRW1haWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGlzX2RlbGl2ZXJhYmxlOiBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgYWxsIGtub3duIGJyZWFjaGVzIG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpZiBrbm93bi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGJyZWFjaF9jb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmaXJzdF9icmVhY2hlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsYXN0X2JyZWFjaGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9yZWdpc3RlcmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19mcmVlX3Byb3ZpZGVyOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19jdXN0b206IFJpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b207XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGRvbWFpbl9pc19kaXNwb3NhYmxlOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICB0b3BfbGV2ZWxfZG9tYWluX2lzX3N1c3BpY2lvdXM6IFJpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXM7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG9ubGluZSBzZXJ2aWNlcyB3aGVyZSB0aGlzIGVtYWlsIGFkZHJlc3MgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyBkb21haW4gaXMgY3VzdG9tIGlmIGtub3duLCBpLmUuIGEgY29tcGFueSBkb21haW4gYW5kIG5vdCBmcmVlIG9yIGRpc3Bvc2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGRvbWFpbiBpcyBsaXN0ZWQgYXMgZGlzcG9zYWJsZSBpZiBrbm93bi4gRGlzcG9zYWJsZSBkb21haW5zIGFyZSBvZnRlbiB1c2VkIHRvIGNyZWF0ZSBlbWFpbCBhZGRyZXNzZXMgdGhhdCBhcmUgcGFydCBvZiBhIGZha2Ugc2V0IG9mIHVzZXIgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGEgZnJlZSBwcm92aWRlciBzdWNoIGFzIEdtYWlsIG9yIEhvdG1haWwgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRnJlZVByb3ZpZGVyIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogU01UUC1NWCBjaGVjayB0byBjb25maXJtIHRoZSBlbWFpbCBhZGRyZXNzIGV4aXN0cyBpZiBrbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIHRvcCBsZXZlbCBkb21haW4sIHdoaWNoIGlzIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGRvbWFpbiwgaXMgZnJhdWR1bGVudCBvciByaXNreSBpZiBrbm93bi4gSW4gbW9zdCBjYXNlcywgYSBzdXNwaWNpb3VzIHRvcCBsZXZlbCBkb21haW4gaXMgYWxzbyBhc3NvY2lhdGVkIHdpdGggYSBkaXNwb3NhYmxlIG9yIGhpZ2gtcmlzayBkb21haW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IGNhcHR1cmluZyBhYnVzZSBzaWduYWxzIHJlbGF0ZWQgdG8gYGlkZW50aXR5IGFidXNlYCwgZS5nLiBzdG9sZW4gYW5kIHN5bnRoZXRpYyBpZGVudGl0eSBmcmF1ZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN5bnRoZXRpY19pZGVudGl0eTogUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAgICAgKi9cbiAgICBzdG9sZW5faWRlbnRpdHk6IFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgbGlua2VkIHNlcnZpY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlIHtcbiAgICBBcHBsZSA9ICdhcHBsZScsXG4gICAgRWJheSA9ICdlYmF5JyxcbiAgICBGYWNlYm9vayA9ICdmYWNlYm9vaycsXG4gICAgRmxpY2tyID0gJ2ZsaWNrcicsXG4gICAgRm91cnNxdWFyZSA9ICdmb3Vyc3F1YXJlJyxcbiAgICBHaXRodWIgPSAnZ2l0aHViJyxcbiAgICBHb29nbGUgPSAnZ29vZ2xlJyxcbiAgICBHcmF2YXRhciA9ICdncmF2YXRhcicsXG4gICAgSW5zdGFncmFtID0gJ2luc3RhZ3JhbScsXG4gICAgTGFzdGZtID0gJ2xhc3RmbScsXG4gICAgTGlua2VkaW4gPSAnbGlua2VkaW4nLFxuICAgIE1pY3Jvc29mdCA9ICdtaWNyb3NvZnQnLFxuICAgIE15c3BhY2UgPSAnbXlzcGFjZScsXG4gICAgUGludGVyZXN0ID0gJ3BpbnRlcmVzdCcsXG4gICAgU2t5cGUgPSAnc2t5cGUnLFxuICAgIFNwb3RpZnkgPSAnc3BvdGlmeScsXG4gICAgVGVsZWdyYW0gPSAndGVsZWdyYW0nLFxuICAgIFR1bWJsciA9ICd0dW1ibHInLFxuICAgIFR3aXR0ZXIgPSAndHdpdHRlcicsXG4gICAgVmliZXIgPSAndmliZXInLFxuICAgIFZpbWVvID0gJ3ZpbWVvJyxcbiAgICBXZWlibyA9ICd3ZWlibycsXG4gICAgV2hhdHNhcHAgPSAnd2hhdHNhcHAnLFxuICAgIFlhaG9vID0gJ3lhaG9vJyxcbiAgICBBaXJibmIgPSAnYWlyYm5iJyxcbiAgICBBbWF6b24gPSAnYW1hem9uJyxcbiAgICBCb29raW5nID0gJ2Jvb2tpbmcnLFxuICAgIERpc2NvcmQgPSAnZGlzY29yZCcsXG4gICAgS2FrYW8gPSAna2FrYW8nLFxuICAgIE9rID0gJ29rJyxcbiAgICBRem9uZSA9ICdxem9uZScsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBTbmFwY2hhdCA9ICdzbmFwY2hhdCcsXG4gICAgWmFsbyA9ICd6YWxvJ1xufVxuXG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYHBob25lYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tQaG9uZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBwaG9uZSBudW1iZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN0b2xlbiBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiB0aGUgc3ludGhldGljIGlkZW50aXR5IHJpc2sgY2hlY2suICBDb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczogIGBzY29yZWAgLSBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3ludGhldGljIGlkZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3ludGhldGljIGlkZW50aXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgZm9yIHRoZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIHN0YXR1cz86IFJpc2tTaWduYWxEb2N1bWVudFN0YXR1cztcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogQURvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlXG4gICAgICovXG4gICAgUk9MRV9ERVRBSUw6IFJvbGVEZXRhaWw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZURldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0eVJvbGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlRGV0YWlsXG4gICAgICovXG4gICAgUGFydHlSb2xlVHlwZTogUGFydHlSb2xlVHlwZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZX1cbiAgICAgKiBAbWVtYmVyb2YgUm9sZXNcbiAgICAgKi9cbiAgICBST0xFOiBSb2xlO1xufVxuLyoqXG4gKiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LiBJZiBwcm92aWRlZCwgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBVUkwgc2V0IGluIHRoZSBkYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX292ZXJyaWRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfZmllbGRzOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHM7XG59XG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgY29kZXMgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byB0ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlIHtcbiAgICBVcGRhdGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEUnLFxuICAgIENvbXBsZXRlID0gJ0JBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEUnXG59XG5cbi8qKlxuICogT3B0aW9uYWwgZmllbGRzIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIHRoZSBzaW11bGF0ZWQgd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IFdlYmhvb2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW0ge1xuICAgIERlZmF1bHRVcGRhdGUgPSAnREVGQVVMVF9VUERBVEUnLFxuICAgIE5ld0FjY291bnRzQXZhaWxhYmxlID0gJ05FV19BQ0NPVU5UU19BVkFJTEFCTEUnLFxuICAgIEF1dGhEYXRhVXBkYXRlID0gJ0FVVEhfREFUQV9VUERBVEUnLFxuICAgIEF1dGhvcml6YXRpb25HcmFudGVkID0gJ0FVVEhPUklaQVRJT05fR1JBTlRFRCcsXG4gICAgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlID0gJ1JFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFJyxcbiAgICBTeW5jVXBkYXRlc0F2YWlsYWJsZSA9ICdTWU5DX1VQREFURVNfQVZBSUxBQkxFJyxcbiAgICBQcm9kdWN0UmVhZHkgPSAnUFJPRFVDVF9SRUFEWScsXG4gICAgRXJyb3IgPSAnRVJST1InXG59XG5cbi8qKlxuICogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIGlzIGB0cnVlYCAgaWYgdGhlIHRlc3RgIHdlYmhvb2tfY29kZWAgIHdhcyBzdWNjZXNzZnVsbHkgZmlyZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2tfZmlyZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB3aG9zZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHRvIGJlIG1vZGlmaWVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIHRvIHNldCB0aGUgYWNjb3VudCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHNhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgb2F1dGhfc3RhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0aGUgSXRlbSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHByb2Nlc3NvciB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIGAvcHJvY2Vzc29yL2AgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgSW5jb21lIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2Ygb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29uZmlndXJpbmcgdGhlIEl0ZW0uIElmIHNwZWNpZmllZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSB3ZWJob29rIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXcgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGVzdCB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGB1c2VyX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfdXNlcm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlc3QgcGFzc3dvcmQgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgcGFzc19nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3Bhc3N3b3JkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb24/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbjtcbn1cbi8qKlxuICogQSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBvcHRpb25zLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYGluaXRpYWxfcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZTtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbnMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCBvbmx5IHRoZSBwZW5kaW5nIGJhbGFuY2UgdGhhdCBpcyBkdWUgYmVmb3JlIHRoZSBgdmlydHVhbF90aW1lc3RhbXBgIG9uIHRoZSB0ZXN0IGNsb2NrIHdpbGwgYmUgY29udmVydGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBldmVudCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIGB0ZXN0X2Nsb2NrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcmVmdW5kLnBvc3RlZGAsIGByZWZ1bmQuc2V0dGxlZGAsIGByZWZ1bmQuZmFpbGVkYCwgb3IgYHJlZnVuZC5yZXR1cm5lZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHJlZnVuZCBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcmVmdW5kLnBlbmRpbmdgIC0tPiBgcmVmdW5kLmZhaWxlZGAgIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQucG9zdGVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnJldHVybmVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnNldHRsZWRgICBgcmVmdW5kLnBvc3RlZGAgZXZlbnRzIGNhbiBvbmx5IGJlIHNpbXVsYXRlZCBpZiB0aGUgcmVmdW5kZWQgdHJhbnNmZXIgaGFzIGJlZW4gdHJhbnNpdGlvbmVkIHRvIHNldHRsZWQuIFRoaXMgbWltaWNzIHRoZSBvcmRlcmluZyBvZiBldmVudHMgaW4gUHJvZHVjdGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldHVybmVkYCAgYHBvc3RlZGAgLS0+IGBzZXR0bGVkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIHN3ZWVwIHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIG9uIHRoZSBkYXkgb2YgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBgdGVzdF9jbG9ja2AuIElmIHRoZSBkYXRlIG9mIGB2aXJ0dWFsX3RpbWVgIGlzIG9uIHdlZWtlbmQgb3IgYSBmZWRlcmFsIGhvbGlkYXksIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcD86IFNpbXVsYXRlZFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmlydHVhbCB0aW1lc3RhbXAgb24gdGhlIHRlc3QgY2xvY2suIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdGltZXN0YW1wIHdpbGwgYmUgdXNlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUZXN0Q2xvY2t9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVzdF9jbG9jazogVHJhbnNmZXJUZXN0Q2xvY2s7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrczogQXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxBY2NvdW50QWNjZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gbmV3bHkgb3BlbmVkIGFjY291bnRzIGFzIHRoZXkgYXJlIG9wZW5lZC4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIGluZGljYXRvciBmb3Igd2hlbiBzY29wZXMgYXJlIGJlaW5nIHVwZGF0ZWQuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIHZpYSBlbnJvbGxtZW50IChpLmUuIE9BdXRoKSwgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBFTlJPTExNRU5UYC4gV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgaW4gYSBwb3N0LWVucm9sbG1lbnQgdmlldywgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBQT1JUQUxgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2NvcGVzQ29udGV4dCB7XG4gICAgRW5yb2xsbWVudCA9ICdFTlJPTExNRU5UJyxcbiAgICBQb3J0YWwgPSAnUE9SVEFMJ1xufVxuXG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTY29wZXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgdXNlciBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCB0aGF0IHdlcmUgY29tcGFyZWQgd2hlbiB0aGUgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AsIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERhdGVzIG9mIGJpcnRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZGF0ZXNfb2ZfYmlydGg/OiBBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIExvY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogQXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIE5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIG5hbWVzPzogQXJyYXk8U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz47XG59XG4vKipcbiAqIEFuYWx5emVkIGRhdGUgb2YgYmlydGggZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRlUmFuZ2V9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGRhdGE/OiBEYXRlUmFuZ2U7XG59XG4vKipcbiAqIEFuYWx5emVkIGRvY3VtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50O1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBpbmRpdmlkdWFsIHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgU0NSRUVOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHNjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIHNlY3VyaXR5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzaW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjdXNpcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlZG9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZ2l2ZW4gdG8gdGhlIHNlY3VyaXR5IGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkYCBpcyBwcmVzZW50LCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgUGxhaWQgYGluc3RpdHV0aW9uX2lkYCBvZiB0aGUgaW5zdGl0dXRpb24gdG8gd2hvbSB0aGUgaWRlbnRpZmllciBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW4gY2VydGFpbiBjYXNlcywgUGxhaWQgd2lsbCBwcm92aWRlIHRoZSBJRCBvZiBhbm90aGVyIHNlY3VyaXR5IHdob3NlIHBlcmZvcm1hbmNlIHJlc2VtYmxlcyB0aGlzIHNlY3VyaXR5LCB0eXBpY2FsbHkgd2hlbiB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgaGFzIGxvdyB2b2x1bWUsIG9yIHdoZW4gYSBwcml2YXRlIHNlY3VyaXR5IGNhbiBiZSBtb2RlbGVkIHdpdGggYSBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBwcm94eV9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgc2VjdXJpdHkgaXMgYSBoaWdobHkgbGlxdWlkIGFzc2V0IGFuZCBjYW4gYmUgdHJlYXRlZCBsaWtlIGNhc2guXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNfY2FzaF9lcXVpdmFsZW50OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHkgdHlwZSBvZiB0aGUgaG9sZGluZy4gVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3B0aW9uQ29udHJhY3R9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgb3B0aW9uX2NvbnRyYWN0OiBPcHRpb25Db250cmFjdCB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogMTItY2hhcmFjdGVyIElTSU4sIGEgZ2xvYmFsbHkgdW5pcXVlIHNlY3VyaXRpZXMgaWRlbnRpZmllci4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzaW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIHNlbGZpZSBhbmQgdGhlIGRvY3VtZW50IChpZiBkb2N1bWVudGFyeSB2ZXJpZmljYXRpb24gYWxzbyByYW4pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb24ge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIFRoZSBpbWFnZSBvciB2aWRlbyBjYXB0dXJlIG9mIGEgc2VsZmllLiBPbmx5IG9uZSBvZiBpbWFnZSBvciB2aWRlbyBVUkwgd2lsbCBiZSBwb3B1bGF0ZWQgcGVyIHNlbGZpZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgZm9yIGRvd25sb2FkaW5nIGFuIGltYWdlIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICBpbWFnZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYSB2aWRlbyBzZWxmaWUgY2FwdHVyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDYXB0dXJlXG4gICAgICovXG4gICAgdmlkZW9fdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLnNlbGZpZV9jaGVja2AgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDaGVja1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2tTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVDaGVja1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBzZWxmaWVzIHN1Ym1pdHRlZCB0byB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC4gRWFjaCBlbnRyeSByZXByZXNlbnRzIG9uZSB1c2VyIHN1Ym1pc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PFNlbGZpZUNoZWNrU2VsZmllPn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzZWxmaWVzOiBBcnJheTxTZWxmaWVDaGVja1NlbGZpZT47XG59XG4vKipcbiAqIENhcHR1cmVzIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3Mgc2VsZmllLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDaGVja1NlbGZpZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIHN0YXR1czogU2VsZmllU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXR0ZW1wdGAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCBzZWxmaWUgdXBsb2FkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDYXB0dXJlfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGNhcHR1cmU6IFNlbGZpZUNhcHR1cmU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBTZWxmaWVBbmFseXNpcztcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYHNlbGZpZV9jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5zZWxmaWVfY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQ2hlY2tTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvdXRjb21lIHN0YXR1cyBmb3IgdGhpcyBzcGVjaWZpYyBzZWxmaWUuIERpc3RpbmN0IGZyb20gdGhlIG92ZXJhbGwgYHNlbGZpZV9jaGVjay5zdGF0dXNgIHRoYXQgc3VtbWFyaXplcyB0aGUgdmVyaWZpY2F0aW9uIG91dGNvbWUgZnJvbSBvbmUgb3IgbW9yZSBzZWxmaWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VuZGVyQkFDU051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IGRlY2lzaW9uIGZyb20gdGhlIHJpc2sgYXNzZXNzbWVudC4gIGBBUFBST1ZFYDogYXBwcm92ZSB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZXF1aXJpbmcgZnVydGhlciBhY3Rpb25zIGZyb20geW91ciBjdXN0b21lcnMuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgYXJlIHBsYWNpbmcgYSBzdGFuZGFyZCBob2xkIGZvciBhbGwgdGhlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gWW91IHNob3VsZCBhbHNvIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBkZWNpZGUgdG8gYWNjZWxlcmF0ZSB0aGUgZnVuZCBhdmFpbGFiaWxpdHkgZm9yIHlvdXIgY3VzdG9tZXJzLiAgYFJFVklFV2A6IHRoZSB0cmFuc2FjdGlvbiByZXF1aXJlcyBtYW51YWwgcmV2aWV3ICBgUkVKRUNUYDogcmVqZWN0IHRoZSB0cmFuc2FjdGlvbiAgYFRBS0VfT1RIRVJfUklTS19NRUFTVVJFU2A6IGZvciBleGFtcGxlLCBwbGFjaW5nIGEgbG9uZ2VyIGhvbGQgb24gZnVuZHMgdGhhbiB0aG9zZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgb3IgaW50cm9kdWNpbmcgY3VzdG9tZXIgZnJpY3Rpb25zIHN1Y2ggYXMgc3RlcC11cCB2ZXJpZmljYXRpb24vYXV0aGVudGljYXRpb24gIGBOT1RfRVZBTFVBVEVEYDogaWYgb25seSBsb2dnaW5nIHRoZSBTaWduYWwgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gIFBvc3NpYmxlIHZhbHVlczogIGBBUFBST1ZFYCwgYFJFVklFV2AsIGBSRUpFQ1RgLCBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYCwgYE5PVF9FVkFMVUFURURgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGRldmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiBcXFwiTW96aWxsYS81LjBcXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY29yZSBhdHRyaWJ1dGVzIG9iamVjdCBjb250YWlucyBhZGRpdGlvbmFsIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgdGhlIEFDSCByZXR1cm4gcmlzay4gRXhhbXBsZXMgb2YgZGF0YSBpbmNsdWRlOiAgYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIGBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50YDogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50ICBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBTYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgd2l0aGluIHRoZSBwYXN0IDkwIGRheXMgd2hlbiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBoYWQgYSBuZWdhdGl2ZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZhaWxhYmxlIGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3VycmVudF9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGJhbGFuY2VfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGlzIGEgcmVjdXJyaW5nIHRyYW5zYWN0aW9uOyBgZmFsc2VgIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9pbmNvbWUvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsU2NvcmVzfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2NvcmVzOiBTaWduYWxTY29yZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBhZnRlciB0aGUgcmlzayBhc3Nlc3NtZW50LiBJdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgcGF5bWVudCBtZXRob2QuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSAgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgIGBTVEFOREFSRF9BQ0hgOiBzdGFuZGFyZCBBQ0ggYnkgTkFDSEEgIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyAgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyAgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciB0aGVyZSBhcmUgbXVsdGlwbGUgcGF5bWVudCBtZXRob2RzICBQb3NzaWJsZSB2YWx1ZXM6IGBTQU1FX0RBWV9BQ0hgLCBgTkVYVF9EQVlfQUNIYCwgYFNUQU5EQVJEX0FDSGAsIGBSRUFMX1RJTUVfUEFZTUVOVFNgLCBgREVCSVRfQ0FSRGAsIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsUGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIE5leHREYXlBY2ggPSAnTkVYVF9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIFJlYWxUaW1lUGF5bWVudHMgPSAnUkVBTF9USU1FX1BBWU1FTlRTJyxcbiAgICBEZWJpdENhcmQgPSAnREVCSVRfQ0FSRCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgcHJlZml4IChlLmcuIFxcXCJNci5cXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBwcmVmaXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBnaXZlbiBuYW1lLiBJZiB0aGUgdXNlciBoYXMgYSBvbmUtd29yZCBuYW1lLCBpdCBzaG91bGQgYmUgcHJvdmlkZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG1pZGRsZSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIG1pZGRsZV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmFtaWx5IG5hbWUgLyBzdXJuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbmFtZSBzdWZmaXggKGUuZy4gXFxcIklJXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNpZ25hbFByZXBhcmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFByZXBhcmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByZXR1cm4gY29kZSAoZS5nLiBcXFwiUjAxXFxcIikgIElmIGZvcm1hdHRlZCBpbmNvcnJlY3RseSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBbYElOVkFMSURfRklFTERgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4geW91IHJlY2VpdmUgdGhlIHJldHVybnMgZnJvbSB5b3VyIHBheW1lbnQgcHJvY2Vzc29ycywgaW4gSVNPIDg2MDEgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmlzayBzY29yaW5nIGRldGFpbHMgYnJva2VuIGRvd24gYnkgcmlzayBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsU2NvcmVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY29yZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY29yZXNcbiAgICAgKi9cbiAgICBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Jpc2s/OiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2s7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtJbml0aWF0ZWRSZXR1cm5SaXNrfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY29yZXNcbiAgICAgKi9cbiAgICBiYW5rX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBlbmQgdXNlciBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiAoaS5lLiwgdGhlIGFjY291bnQgaG9sZGVyKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsVXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsVXNlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFBlcnNvbk5hbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogU2lnbmFsUGVyc29uTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1MTIzNDU2N1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFNpZ25hbEFkZHJlc3NEYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQ29udmV5cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgbWlzc2luZyBvciBzdGFsZSBiYW5rIGRhdGEgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIC9zaWduYWwvZXZhbHVhdGUgc2NvcmVzIGFuZCByZXNwb25zZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxXYXJuaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSB3YXJuaW5nLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nIHRoYXQgcGVydGFpbnMgdG8gdGhlIGVycm9yIGNhdXNpbmcgYmFuayBkYXRhIHRvIGJlIG1pc3NpbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuIEZvciBtb3JlIGRldGFpbHMgb24gd2FybmluZyBjb2RlcywgcGxlYXNlIHJlZmVyIHRvIFBsYWlkIHN0YW5kYXJkIGVycm9yIGNvZGVzIGRvY3VtZW50YXRpb24uIElmIHlvdSByZWNlaXZlIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2FybmluZywgd2UgcmVjb21tZW5kIHJlLWF1dGhlbnRpY2F0aW5nIHlvdXIgdXNlciBieSBpbXBsZW1lbnRpbmcgTGlua1xcJ3MgdXBkYXRlIG1vZGUuIFRoaXMgd2lsbCBndWlkZSB5b3VyIHVzZXIgdG8gZml4IHRoZWlyIGNyZWRlbnRpYWxzLCBhbGxvd2luZyBQbGFpZCB0byBzdGFydCBmZXRjaGluZyBkYXRhIGFnYWluIGZvciBmdXR1cmUgU2lnbmFsIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdhcm5pbmcgdHlwZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfbWVzc2FnZT86IHN0cmluZztcbn1cbi8qKlxuICogQSBzd2VlcCByZXR1cm5lZCBmcm9tIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50LiBDYW4gYmUgbnVsbCBpZiB0aGVyZSBhcmUgbm8gdHJhbnNmZXJzIHRvIGluY2x1ZGUgaW4gYSBzd2VlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBkZWNpbWFsIGFtb3VudCBvZiB0aGUgc3dlZXAgYXMgaXQgYXBwZWFycyBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyIChlLmcuIFxcXCItMTAuMDBcXFwiKSAgSWYgYW1vdW50IGlzIG5vdCBwcmVzZW50LCB0aGUgc3dlZXAgd2FzIG5ldC1zZXR0bGVkIHRvIHplcm8gYW5kIG91dHN0YW5kaW5nIGRlYml0cyBhbmQgY3JlZGl0cyBiZXR3ZWVuIHRoZSBzd2VlcCBhY2NvdW50IGFuZCBQbGFpZCBhcmUgYmFsYW5jZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3dlZXAgc2V0dGxlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzZXR0bGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgdHJpZ2dlcj86IFN3ZWVwVHJpZ2dlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBhbGwgcmlzayBzaWduYWxzIGFuZCByZWxldmFudCBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBkb2N1bWVudF9yZWZlcmVuY2U6IFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBhdHRyaWJ1dGVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlcmUgaXMgZnJhdWQgcmlzayB3aXRoIGEgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgU2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcmlza19zaWduYWxzOiBBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFJpc2tTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3N1bW1hcnk6IERvY3VtZW50Umlza1N1bW1hcnk7XG59XG4vKipcbiAqIEEgdHlwZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBkYXNoYm9hcmQgdXNlciwgYW4gQVBJLWJhc2VkIHVzZXIsIG9yIFBsYWlkIGxhc3QgdG91Y2hlZCB0aGlzIG9iamVjdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNvdXJjZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgTGluayA9ICdsaW5rJyxcbiAgICBBcGkgPSAnYXBpJyxcbiAgICBTeXN0ZW0gPSAnc3lzdGVtJ1xufVxuXG4vKipcbiAqIFRoZSBzY2hlbWEgYmVsb3cgZGVzY3JpYmVzIHRoZSB2YXJpb3VzIGB0eXBlc2AgYW5kIGNvcnJlc3BvbmRpbmcgYHN1YnR5cGVzYCB0aGF0IFBsYWlkIHJlY29nbml6ZXMgYW5kIHJlcG9ydHMgZm9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2NvdW50IHR5cGUgaG9sZGluZyBjYXNoLCBpbiB3aGljaCBmdW5kcyBhcmUgZGVwb3NpdGVkLiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBkZXBvc2l0b3J5YCBhY2NvdW50cyBhcmU6IEF1dGggKGBjaGVja2luZ2AgYW5kIGBzYXZpbmdzYCB0eXBlcyBvbmx5KSwgQmFsYW5jZSwgVHJhbnNhY3Rpb25zLCBJZGVudGl0eSwgUGF5bWVudCBJbml0aWF0aW9uLCBBc3NldHMsIGFuZCBJbnZlc3RtZW50cyAoYGNhc2ggbWFuYWdlbWVudGAgdHlwZSBvbmx5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjcmVkaXQgY2FyZCB0eXBlIGFjY291bnQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGNyZWRpdGAgYWNjb3VudHMgYXJlOiBCYWxhbmNlLCBUcmFuc2FjdGlvbnMsIElkZW50aXR5LCBhbmQgTGlhYmlsaXRpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgY3JlZGl0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsb2FuIHR5cGUgYWNjb3VudC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgbG9hbmAgYWNjb3VudHMgYXJlOiBCYWxhbmNlLCBMaWFiaWxpdGllcywgYW5kIFRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBsb2FuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaW52ZXN0bWVudCBhY2NvdW50LiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBpbnZlc3RtZW50YCBhY2NvdW50cyBhcmU6IEJhbGFuY2UgYW5kIEludmVzdG1lbnRzLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyB0eXBlIGlzIGNhbGxlZCBgYnJva2VyYWdlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3RoZXIgb3IgdW5rbm93biBhY2NvdW50IHR5cGUuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYG90aGVyYCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIFRyYW5zYWN0aW9ucywgSWRlbnRpdHksIGFuZCBBc3NldHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgb3RoZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZvbGxvd2luZyBjdXJyZW5jeSBjb2RlcyBhcmUgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBzdXBwb3J0cyBhbGwgSVNPIDQyMTcgY3VycmVuY3kgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2Rlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIHZhbHVlcyBmb3IgaW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMuIE5vdGUgdGhhdCB0cmFuc2FjdGlvbnMgcmVwcmVzZW50aW5nIGluZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIG5lZ2F0aXZlIGFtb3VudHMsIG91dGZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBwb3NpdGl2ZSBhbW91bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBCdXlpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgYnV5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2VsbGluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBzZWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYW5jZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FzaDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZlZXMgb24gdGhlIGFjY291bnQsIGUuZy4gY29tbWlzc2lvbiwgYm9va2tlZXBpbmcsIG9wdGlvbnMtcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGZlZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICB0cmFuc2Zlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNBY2NvdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudC4gUG9zc2libGUgdmFsdWVzIGFyZSBpbnZlc3RtZW50LCBjcmVkaXQsIGRlcG9zaXRvcnksIGxvYW4sIGJyb2tlcmFnZSwgb3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBzdGF0ZW1lbnRzXFwnIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFN0YXRlbWVudHNTdGF0ZW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIHN0YXRlbWVudHM6IEFycmF5PFN0YXRlbWVudHNTdGF0ZW1lbnQ+O1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvZG93bmxvYWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8U3RhdGVtZW50c0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IHJlZnJlc2ggZXh0cmFjdGlvbiAgYFNVQ0NFU1NgOiBUaGUgc3RhdGVtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgYW5kIGNhbiBiZSBsaXN0ZWQgdmlhIGAvc3RhdGVtZW50cy9saXN0L2AgYW5kIGRvd25sb2FkZWQgdmlhIGAvc3RhdGVtZW50cy9kb3dubG9hZC9gLiAgYEZBSUxVUkVgOiBUaGUgc3RhdGVtZW50cyBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiByZWZyZXNoZWQgc3RhdGVtZW50cyBleHRyYWN0aW9uIGlzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYmUgY29tcGxldGVkLiBUcmlnZ2VyZWQgYnkgY2FsbGluZyBgL3N0YXRlbWVudHMvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBTVEFURU1FTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIGZvciBzdGF0ZW1lbnRzLCBpbiDigJxZWVlZLU1NLURE4oCdIGZvcm1hdCwgZS5nLiBcXFwiMjAyMy0wOC0zMFxcXCIuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIzLTEwLTMwXFxcIi4gWW91IGNhbiByZXF1ZXN0IHVwIHRvIHR3byB5ZWFycyBvZiBkYXRhLiBUbyBkZXRlcm1pbmUgd2hldGhlciBhIHN0YXRlbWVudCBmYWxscyB3aXRoaW4gdGhlIHNwZWNpZmllZCBkYXRlIHJhbmdlLCBQbGFpZCB3aWxsIHVzZSB0aGUgc3RhdGVtZW50IHBvc3RlZCBkYXRlLiBUaGUgc3RhdGVtZW50IHBvc3RlZCBkYXRlIGlzIHR5cGljYWxseSBlaXRoZXIgdGhlIGxhc3QgZGF5IG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kLCBvciB0aGUgZm9sbG93aW5nIGRheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBzdGF0ZW1lbnRcXCdzIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1N0YXRlbWVudFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1vbnRoIG9mIHRoZSB5ZWFyLiBQb3NzaWJsZSB2YWx1ZXM6IDEgdGhyb3VnaCAxMiAoSmFudWFyeSB0aHJvdWdoIERlY2VtYmVyKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgbW9udGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciBvZiBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1N0YXRlbWVudFxuICAgICAqL1xuICAgIHllYXI6IG51bWJlcjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFNhdHVzIENvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgU3RhdHVzQ29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0dXMgRGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzXG4gICAgICovXG4gICAgU3RhdHVzRGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBTVEFUVVMgY29udGFpbmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdHVzZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdHVzZXNcbiAgICAgKi9cbiAgICBTVEFUVVM6IFN0YXR1cztcbn1cbi8qKlxuICogQW4gaW5zdHJ1Y3Rpb24gc3BlY2lmeWluZyB3aGF0IHN0ZXBzIHRoZSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgc2hvdWxkIHJlcXVpcmUgdGhlIHVzZXIgdG8gY29tcGxldGU6ICAgYHJlc2V0YCAtIFJlc3RhcnQgdGhlIHVzZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vzc2lvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBwYXJ0IG9mIHRoZWlyIHByZXZpb3VzIHNlc3Npb24uICBgaW5jb21wbGV0ZWAgLSBTdGFydCB0aGUgbmV3IHNlc3Npb24gYXQgdGhlIHN0ZXAgdGhhdCB0aGUgdXNlciBmYWlsZWQgaW4gdGhlIHByZXZpb3VzIHNlc3Npb24sIHNraXBwaW5nIHN0ZXBzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gIGBpbmZlcmAgLSBJZiB0aGUgbW9zdCByZWNlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgIGhhcyBhIHN0YXR1cyBvZiBgZmFpbGVkYCBvciBgZXhwaXJlZGAsIHJldHJ5IHVzaW5nIHRoZSBgaW5jb21wbGV0ZWAgc3RyYXRlZ3kuIE90aGVyd2lzZSwgdXNlIHRoZSBgcmVzZXRgIHN0cmF0ZWd5LiAgYGN1c3RvbWAgLSBTdGFydCB0aGUgbmV3IHNlc3Npb24gd2l0aCBhIGN1c3RvbSBjb25maWd1cmF0aW9uLCBzcGVjaWZpZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBgc3RlcHNgIGZpZWxkICBOb3RlOiAgVGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneSBjYW5ub3QgYmUgYXBwbGllZCBpZiB0aGUgc2Vzc2lvblxcJ3MgZmFpbGluZyBzdGVwIGlzIGBzY3JlZW5pbmdgIG9yIGByaXNrX2NoZWNrYC4gIFRoZSBgaW5mZXJgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBzdGF0dXMgaXMgc3RpbGwgYGFjdGl2ZWBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFN0cmF0ZWd5IHtcbiAgICBSZXNldCA9ICdyZXNldCcsXG4gICAgSW5jb21wbGV0ZSA9ICdpbmNvbXBsZXRlJyxcbiAgICBJbmZlciA9ICdpbmZlcicsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbSdcbn1cblxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc3R1ZGVudCBsb2FuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBsb2FuLiBGb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGJlIGEgbWFza2VkIHZlcnNpb24gb2YgdGhlIG51bWJlciAoZS5nLiwgdGhlIGxhc3QgNCBkaWdpdHMgaW5zdGVhZCBvZiB0aGUgZW50aXJlIG51bWJlcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXMgb24gd2hpY2ggbG9hbmVkIGZ1bmRzIHdlcmUgZGlzYnVyc2VkIG9yIHdpbGwgYmUgZGlzYnVyc2VkLiBUaGVzZSBhcmUgb2Z0ZW4gaW4gdGhlIHBhc3QuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGRpc2J1cnNlbWVudF9kYXRlczogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3R1ZGVudCBsb2FuIGlzIGV4cGVjdGVkIHRvIGJlIHBhaWQgb2ZmLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBleHBlY3RlZF9wYXlvZmZfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZ3VhcmFudG9yIG9mIHRoZSBzdHVkZW50IGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBndWFyYW50b3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgaW50ZXJlc3RfcmF0ZV9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIGEgcGF5bWVudCBpcyBjdXJyZW50bHkgb3ZlcmR1ZS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIE5lbG5ldCAoYGluc18xMTY1MjhgKSwgRWRGaW5hbmNpYWwgU2VydmljZXMgKGBpbnNfMTE2MzA0YCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIGFuZCBOYXZpZW50IChgaW5zXzExNjI0OGApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbl9zY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBgYWNjb3VudF9udW1iZXIsYCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHBzbGZfc3RhdHVzOiBQU0xGU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50UmVwYXltZW50UGxhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbjogU3R1ZGVudFJlcGF5bWVudFBsYW47XG4gICAgLyoqXG4gICAgICogVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgc3R1ZGVudCBsb2FuLiBIZWFydGxhbmQgRUNTSSAoYGluc18xMTY5NDhgKSBkb2VzIG5vdCBtYWtlIHRoaXMgZmllbGQgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VxdWVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlckFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHNlcnZpY2VyX2FkZHJlc3M6IFNlcnZpY2VyQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBpbnRlcmVzdCBwYWlkLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHl0ZF9pbnRlcmVzdF9wYWlkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgcHJpbmNpcGFsIHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX3ByaW5jaXBhbF9wYWlkOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBTdHVkZW50IGxvYW4gcmVwYXltZW50IGluZm9ybWF0aW9uIHVzZWQgdG8gY29uZmlndXJlIFNhbmRib3ggdGVzdCBkYXRhIGZvciB0aGUgTGlhYmlsaXRpZXMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyBgc3RhbmRhcmRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBiZWZvcmUgcmVwYXltZW50IHN0YXJ0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsXG4gICAgICovXG4gICAgbm9uX3JlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIG9mIHJlcGF5bWVudHMgYmVmb3JlIHRoZSBsb2FuIGlzIHBhaWQgb2ZmLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9udGhzOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHVudGlsIHdoaWNoIHRoZSBsb2FuIHdpbGwgYmUgaW4gaXRzIGN1cnJlbnQgc3RhdHVzLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIHR5cGUgb2YgdGhlIHN0dWRlbnQgbG9hblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuU3RhdHVzXG4gICAgICovXG4gICAgdHlwZTogU3R1ZGVudExvYW5TdGF0dXNUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtIHtcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBDaGFyZ2VkT2ZmID0gJ2NoYXJnZWQgb2ZmJyxcbiAgICBDbGFpbSA9ICdjbGFpbScsXG4gICAgQ29uc29saWRhdGVkID0gJ2NvbnNvbGlkYXRlZCcsXG4gICAgRGVmZXJtZW50ID0gJ2RlZmVybWVudCcsXG4gICAgRGVsaW5xdWVudCA9ICdkZWxpbnF1ZW50JyxcbiAgICBEaXNjaGFyZ2VkID0gJ2Rpc2NoYXJnZWQnLFxuICAgIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nLFxuICAgIEZvcmJlYXJhbmNlID0gJ2ZvcmJlYXJhbmNlJyxcbiAgICBJbkdyYWNlID0gJ2luIGdyYWNlJyxcbiAgICBJbk1pbGl0YXJ5ID0gJ2luIG1pbGl0YXJ5JyxcbiAgICBJblNjaG9vbCA9ICdpbiBzY2hvb2wnLFxuICAgIE5vdEZ1bGx5RGlzYnVyc2VkID0gJ25vdCBmdWxseSBkaXNidXJzZWQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYWlkSW5GdWxsID0gJ3BhaWQgaW4gZnVsbCcsXG4gICAgUmVmdW5kZWQgPSAncmVmdW5kZWQnLFxuICAgIFJlcGF5bWVudCA9ICdyZXBheW1lbnQnLFxuICAgIFRyYW5zZmVycmVkID0gJ3RyYW5zZmVycmVkJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcGF5bWVudCBwbGFuIGZvciB0aGUgc3R1ZGVudCBsb2FuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRSZXBheW1lbnRQbGFuXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVwYXltZW50IHBsYW4gYXMgcHJvdmlkZWQgYnkgdGhlIHNlcnZpY2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRSZXBheW1lbnRQbGFuXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlcGF5bWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRSZXBheW1lbnRQbGFuXG4gICAgICovXG4gICAgdHlwZTogU3R1ZGVudFJlcGF5bWVudFBsYW5UeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtIHtcbiAgICBFeHRlbmRlZEdyYWR1YXRlZCA9ICdleHRlbmRlZCBncmFkdWF0ZWQnLFxuICAgIEV4dGVuZGVkU3RhbmRhcmQgPSAnZXh0ZW5kZWQgc3RhbmRhcmQnLFxuICAgIEdyYWR1YXRlZCA9ICdncmFkdWF0ZWQnLFxuICAgIEluY29tZUNvbnRpbmdlbnRSZXBheW1lbnQgPSAnaW5jb21lLWNvbnRpbmdlbnQgcmVwYXltZW50JyxcbiAgICBJbmNvbWVCYXNlZFJlcGF5bWVudCA9ICdpbmNvbWUtYmFzZWQgcmVwYXltZW50JyxcbiAgICBJbnRlcmVzdE9ubHkgPSAnaW50ZXJlc3Qtb25seScsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBheUFzWW91RWFybiA9ICdwYXkgYXMgeW91IGVhcm4nLFxuICAgIFJldmlzZWRQYXlBc1lvdUVhcm4gPSAncmV2aXNlZCBwYXkgYXMgeW91IGVhcm4nLFxuICAgIFN0YW5kYXJkID0gJ3N0YW5kYXJkJyxcbiAgICBTYXZpbmdPbkFWYWx1YWJsZUVkdWNhdGlvbiA9ICdzYXZpbmcgb24gYSB2YWx1YWJsZSBlZHVjYXRpb24nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGEgc3dlZXAgdHJhbnNmZXIgIGBcXFwicGVuZGluZ1xcXCJgIC0gVGhlIHN3ZWVwIGlzIGN1cnJlbnRseSBwZW5kaW5nIGBcXFwicG9zdGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGJlZW4gcG9zdGVkIGBcXFwic2V0dGxlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBzZXR0bGVkIGBcXFwicmV0dXJuZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiByZXR1cm5lZCBgXFxcImZhaWxlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBmYWlsZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFN3ZWVwU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc2V0dGxlZCcsXG4gICAgUmV0dXJuZWQgPSAncmV0dXJuZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgdHJpZ2dlciBvZiB0aGUgc3dlZXAgIGBcXFwibWFudWFsXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBtYW51YWxseSBieSB0aGUgY3VzdG9tZXIgYFxcXCJpbmNvbWluZ1xcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgaW5jb21pbmcgZnVuZHMgZmxvdyAoZS5nLiBJbmNvbWluZyBXaXJlKSBgXFxcImJhbGFuY2VfdGhyZXNob2xkXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSBiYWxhbmNlIHRocmVzaG9sZCBzZXR0aW5nIGBcXFwiYXV0b21hdGljX2FnZ3JlZ2F0ZVxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgdGhlIFBsYWlkIGF1dG9tYXRpYyBhZ2dyZWdhdGlvbiBwcm9jZXNzLiBUaGVzZSBmdW5kcyBkaWQgbm90IHBhc3MgdGhyb3VnaCB0aGUgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTd2VlcFRyaWdnZXIge1xuICAgIE1hbnVhbCA9ICdtYW51YWwnLFxuICAgIEluY29taW5nID0gJ2luY29taW5nJyxcbiAgICBCYWxhbmNlVGhyZXNob2xkID0gJ2JhbGFuY2VfdGhyZXNob2xkJyxcbiAgICBBdXRvbWF0aWNBZ2dyZWdhdGUgPSAnYXV0b21hdGljX2FnZ3JlZ2F0ZSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyBjaGFuZ2UuIFRoaXMgY2FuIGJlIGR1ZSB0byBhbnkgZXZlbnQgcmVzdWx0aW5nIGluIG5ldyBjaGFuZ2VzLCBzdWNoIGFzIGFuIGluaXRpYWwgMzAtZGF5IHRyYW5zYWN0aW9ucyBmZXRjaCB1cG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiBhbiBJdGVtIHdpdGggdHJhbnNhY3Rpb25zLCB0aGUgYmFja2ZpbGwgb2YgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgdGhhdCBvY2N1cnMgc2hvcnRseSBhZnRlciwgb3Igd2hlbiBjaGFuZ2VzIGFyZSBwb3B1bGF0ZWQgZnJvbSBhIHJlZ3VsYXJseS1zY2hlZHVsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBqb2IuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIHdoZW4gdXNpbmcgdGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LiBOb3RlIHRoYXQgd2hlbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCB0aGUgb2xkZXIgd2ViaG9va3MgYElOSVRJQUxfVVBEQVRFYCwgYEhJU1RPUklDQUxfVVBEQVRFYCwgYERFRkFVTFRfVVBEQVRFYCwgYW5kIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGAsIHdoaWNoIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YCwgd2lsbCBhbHNvIGNvbnRpbnVlIHRvIGJlIHNlbnQgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aG9zZSB3ZWJob29rcyB3aGVuIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSBuZXcgY2hhbmdlcyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0gZnJvbSBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3IgYW4gSXRlbSwgYC90cmFuc2FjdGlvbnMvc3luY2AgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Ugb24gdGhhdCBJdGVtLiBUaGlzIG1lYW5zIHRoYXQsIHVubGlrZSB0aGUgYElOSVRJQUxfVVBEQVRFYCBhbmQgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rcywgaXQgd2lsbCBub3QgZmlyZSBpbW1lZGlhdGVseSB1cG9uIEl0ZW0gY3JlYXRpb24uIElmIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGlzIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgd2FzICpub3QqIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zLCB0aGUgd2ViaG9vayB3aWxsIGZpcmUgdHdpY2U6IG9uY2UgdGhlIGZpcnN0IDMwIGRheXMgb2YgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZCwgYW5kIGEgc2Vjb25kIHRpbWUgd2hlbiBhbGwgYXZhaWxhYmxlIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4gIFRoaXMgd2ViaG9vayB3aWxsIGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYXMgaXQgd291bGQgaW4gUHJvZHVjdGlvbi4gSXQgY2FuIGFsc28gYmUgbWFudWFsbHkgdHJpZ2dlcmVkIGluIFNhbmRib3ggYnkgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5pdGlhbCBwdWxsIGluZm9ybWF0aW9uIChtb3N0IHJlY2VudCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkpIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaW5pdGlhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGhpc3RvcmljYWwgcHVsbCBpbmZvcm1hdGlvbiAobWF4aW11bSB0cmFuc2FjdGlvbiBoaXN0b3J5IHJlcXVlc3RlZCwgdXAgdG8gMiB5ZWFycykgaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IGFuIG9mZmljaWFsIGRvY3VtZW50IHVzZWQgdG8gcmVwb3J0IHRoZSB1c2VyXFwncyBpbmNvbWUgdG8gdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4Zm9ybVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVGF4Zm9ybSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGF4IGRvY3VtZW50LiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgdzJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1cyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgdzI/OiBXMjtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklEXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklEIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMYXN0IDQgZGlnaXRzIG9mIHVuaXF1ZSBudW1iZXIgb2YgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGFzdF80X2RpZ2l0cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LkluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJUeXBlOiBUYXhwYXllcklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRheHBheWVyIGlkZW50aWZpZXIgYXMgYXNzaWduZWQgYnkgdGhlIElSUyB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyXG4gICAgICovXG4gICAgVGF4cGF5ZXJJZGVudGlmaWVyVmFsdWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IGNsYXNzaWZpZXMgaWRlbnRpZmljYXRpb24gbnVtYmVycyB1c2VkIGJ5IHRoZSBJbnRlcm5hbCBSZXZlbnVlIFNlcnZpY2UgKElSUykgaW4gdGhlIGFkbWluaXN0cmF0aW9uIG9mIHRheCBsYXdzLiBBIFNvY2lhbCBTZWN1cml0eSBudW1iZXIgKFNTTikgaXMgaXNzdWVkIGJ5IHRoZSBTU0E7IGFsbCBvdGhlciB0YXhwYXllciBpZGVudGlmaWNhdGlvbiBudW1iZXJzIGFyZSBpc3N1ZWQgYnkgdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRheHBheWVySWRlbnRpZmllclR5cGUge1xuICAgIEluZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyID0gJ0luZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyJyxcbiAgICBTb2NpYWxTZWN1cml0eU51bWJlciA9ICdTb2NpYWxTZWN1cml0eU51bWJlcidcbn1cblxuLyoqXG4gKiBUaGUgY29sbGVjdGlvbiBvZiBUQVhQQVlFUl9JREVOVElGSUNBVElPTiBlbGVtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyc1xuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVI6IFRheHBheWVySWRlbnRpZmllcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGEgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUb3RhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YTogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRlYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRlYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRldGltZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRldGltZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRldGltZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBUaGlzIGZpZWxkIHJlcGxhY2VzIHRoZSBgdHJhbnNhY3Rpb25fdHlwZWAgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBUcmFuc2FjdGlvblBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvZGU6IFRyYW5zYWN0aW9uQ29kZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRldGltZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRldGltZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRldGltZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgcmF0aGVyIHRoYW4gcG9zdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCBmaWVsZC4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBUcmFuc2FjdGlvbkFsbE9mUGF5bWVudENoYW5uZWxFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvZGU6IFRyYW5zYWN0aW9uQ29kZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25CYXNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS4gVG8gcmVjZWl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSB0aGF0IGEgcG9zdGVkIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIGlzIGluIGJldGEgYW5kIHdpbGwgYmUgb21pdHRlZCB1bmxlc3MgdGhlIGNsaWVudCBpcyBib3RoIGVucm9sbGVkIGluIHRoZSBjbG9zZWQgYmV0YSBwcm9ncmFtIGFuZCBoYXMgc2V0IGBvcHRpb25zLmluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb25gIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE/OiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQmFzZVRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEFuIGlkZW50aWZpZXIgY2xhc3NpZnlpbmcgdGhlIHRyYW5zYWN0aW9uIHR5cGUuICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBFdXJvcGVhbiBpbnN0aXR1dGlvbnMuIEZvciBpbnN0aXR1dGlvbnMgaW4gdGhlIFVTIGFuZCBDYW5hZGEsIHRoaXMgZmllbGQgaXMgc2V0IHRvIGBudWxsYC4gIGBhZGp1c3RtZW50OmAgQmFuayBhZGp1c3RtZW50ICBgYXRtOmAgQ2FzaCBkZXBvc2l0IG9yIHdpdGhkcmF3YWwgdmlhIGFuIGF1dG9tYXRlZCB0ZWxsZXIgbWFjaGluZSAgYGJhbmsgY2hhcmdlOmAgQ2hhcmdlIG9yIGZlZSBsZXZpZWQgYnkgdGhlIGluc3RpdHV0aW9uICBgYmlsbCBwYXltZW50YDogUGF5bWVudCBvZiBhIGJpbGwgIGBjYXNoOmAgQ2FzaCBkZXBvc2l0IG9yIHdpdGhkcmF3YWwgIGBjYXNoYmFjazpgIENhc2ggd2l0aGRyYXdhbCB3aGlsZSBtYWtpbmcgYSBkZWJpdCBjYXJkIHB1cmNoYXNlICBgY2hlcXVlOmAgRG9jdW1lbnQgb3JkZXJpbmcgdGhlIHBheW1lbnQgb2YgbW9uZXkgdG8gYW5vdGhlciBwZXJzb24gb3Igb3JnYW5pemF0aW9uICBgZGlyZWN0IGRlYml0OmAgQXV0b21hdGljIHdpdGhkcmF3YWwgb2YgZnVuZHMgaW5pdGlhdGVkIGJ5IGEgdGhpcmQgcGFydHkgYXQgYSByZWd1bGFyIGludGVydmFsICBgaW50ZXJlc3Q6YCBJbnRlcmVzdCBlYXJuZWQgb3IgaW5jdXJyZWQgIGBwdXJjaGFzZTpgIFB1cmNoYXNlIG1hZGUgd2l0aCBhIGRlYml0IG9yIGNyZWRpdCBjYXJkICBgc3RhbmRpbmcgb3JkZXI6YCBQYXltZW50IGluc3RydWN0ZWQgYnkgdGhlIGFjY291bnQgaG9sZGVyIHRvIGEgdGhpcmQgcGFydHkgYXQgYSByZWd1bGFyIGludGVydmFsICBgdHJhbnNmZXI6YCBUcmFuc2ZlciBvZiBtb25leSBiZXR3ZWVuIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkNvZGUge1xuICAgIEFkanVzdG1lbnQgPSAnYWRqdXN0bWVudCcsXG4gICAgQXRtID0gJ2F0bScsXG4gICAgQmFua0NoYXJnZSA9ICdiYW5rIGNoYXJnZScsXG4gICAgQmlsbFBheW1lbnQgPSAnYmlsbCBwYXltZW50JyxcbiAgICBDYXNoID0gJ2Nhc2gnLFxuICAgIENhc2hiYWNrID0gJ2Nhc2hiYWNrJyxcbiAgICBDaGVxdWUgPSAnY2hlcXVlJyxcbiAgICBEaXJlY3REZWJpdCA9ICdkaXJlY3QgZGViaXQnLFxuICAgIEludGVyZXN0ID0gJ2ludGVyZXN0JyxcbiAgICBQdXJjaGFzZSA9ICdwdXJjaGFzZScsXG4gICAgU3RhbmRpbmdPcmRlciA9ICdzdGFuZGluZyBvcmRlcicsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGlzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q291bnRlcnBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGxvZ29fdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgaG93IGNvbmZpZGVudCB3ZSBhcmUgdGhhdCB0aGUgcHJvdmlkZWQgY291bnRlcnBhcnR5IGlzIGludm9sdmVkIGluIHRoZSB0cmFuc2FjdGlvbi4gIGBWRVJZX0hJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDkwJSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgTUVESVVNYDogV2UgYXJlIG1vZGVyYXRlbHkgY29uZmlkZW50IHRoYXQgdGhpcyBjb3VudGVycGFydHkgd2FzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIGJ1dCBzb21lIGRldGFpbHMgbWF5IGRpZmZlciBmcm9tIG91ciByZWNvcmRzLiBgTE9XYDogV2UgZGlkbuKAmXQgZmluZCBhIG1hdGNoaW5nIGNvdW50ZXJwYXJ0eSBpbiBvdXIgcmVjb3Jkcywgc28gd2UgYXJlIHJldHVybmluZyBhIGNsZWFuc2VkIG5hbWUgcGFyc2VkIG91dCBvZiB0aGUgcmVxdWVzdCBkZXNjcmlwdGlvbi4gYFVOS05PV05gOiBXZSBkb27igJl0IGtub3cgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIHRoaXMgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXRjaGVkIGRpcmVjdCBkZXBvc2l0IHRyYW5zYWN0aW9uIHVzZWQgdG8gdmVyaWZ5IGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25EYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbmQgdXNlclxcJ3MgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgdG8gcG9wdWxhdGUgYXMgdGVzdCB0cmFuc2FjdGlvbiBkYXRhLiBJZiBub3Qgc3BlY2lmaWVkLCByYW5kb20gdHJhbnNhY3Rpb25zIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3ZlcnJpZGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFRyYW5zYWN0aW9ucyBpbiBTYW5kYm94IHdpbGwgbW92ZSBmcm9tIHBlbmRpbmcgdG8gcG9zdGVkIG9uY2UgdGhlaXIgdHJhbnNhY3Rpb24gZGF0ZSBoYXMgYmVlbiByZWFjaGVkLiBJZiBhIGBkYXRlX3RyYW5zYWN0ZWRgIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24sIGEgdHJhbnNhY3Rpb24gZGF0ZSBtYXkgYmUgYXZhaWxhYmxlIGluIHRoZSBbYGF1dGhvcml6ZWRfZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zLWdldC1yZXNwb25zZS10cmFuc2FjdGlvbnMtYXV0aG9yaXplZC1kYXRlKSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gUG9zdGVkIGRhdGVzIGluIHRoZSBwYXN0IG9yIHByZXNlbnQgd2lsbCByZXN1bHQgaW4gcG9zdGVkIHRyYW5zYWN0aW9uczsgcG9zdGVkIGRhdGVzIGluIHRoZSBmdXR1cmUgd2lsbCByZXN1bHQgaW4gcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudC4gQ2FuIGJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGZvcm1hdCBjdXJyZW5jeSBjb2RlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGdyb3VwaW5nIG9mIHJlbGF0ZWQgdHJhbnNhY3Rpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0byB3aGljaCB0aGUgc3RyZWFtIGJlbG9uZ3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhlIHN0cmVhbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAuIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBwcm92aWRlcyBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24gYW5kIGdyZWF0ZXIgYWNjdXJhY3kuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGVkIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBmaXJzdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k6IFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgYXZlcmFnZV9hbW91bnQ6IFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbSBpcyBzdGlsbCBsaXZlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGlzX2FjdGl2ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25TdHJlYW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIHdpbGwgYmUgc2V0IHRvIGB0cnVlYCBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHJlcXVlc3QgdG8gYSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtc2AgZW5kcG9pbnQuIEl0IHdpbGwgYmUgYGZhbHNlYCBmb3IgYWxsIG90aGVyIHN0cmVhbXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfdXNlcl9tb2RpZmllZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbW9zdCByZWNlbnQgdXNlciBtb2RpZmljYXRpb24uIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBpZiBgaXNfdXNlcl9tb2RpZmllZGAgaXMgYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbGFzdF91c2VyX21vZGlmaWVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3Qgd2l0aCBkYXRhIHBlcnRhaW5pbmcgdG8gYW4gYW1vdW50IG9uIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbUFtb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiBhbiBhbW91bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBNQVRVUkVgOiBBIGBNQVRVUkVgIHJlY3VycmluZyBzdHJlYW0gc2hvdWxkIGhhdmUgYXQgbGVhc3QgMyB0cmFuc2FjdGlvbnMgYW5kIGhhcHBlbiBvbiBhIHJlZ3VsYXIgY2FkZW5jZSAoRm9yIEFubnVhbCByZWN1cnJpbmcgc3RyZWFtLCB3ZSB3aWxsIG1hcmsgaXQgYE1BVFVSRWAgYWZ0ZXIgMiBpbnN0YW5jZXMpLiAgYEVBUkxZX0RFVEVDVElPTmA6IFdoZW4gYSByZWN1cnJpbmcgdHJhbnNhY3Rpb24gZmlyc3QgYXBwZWFycyBpbiB0aGUgdHJhbnNhY3Rpb24gaGlzdG9yeSBhbmQgYmVmb3JlIGl0IGZ1bGZpbGxzIHRoZSByZXF1aXJlbWVudCBvZiBhIG1hdHVyZSBzdHJlYW0sIHRoZSBzdGF0dXMgd2lsbCBiZSBgRUFSTFlfREVURUNUSU9OYC4gIGBUT01CU1RPTkVEYDogQSBzdHJlYW0gdGhhdCB3YXMgcHJldmlvdXNseSBpbiB0aGUgYEVBUkxZX0RFVEVDVElPTmAgc3RhdHVzIHdpbGwgbW92ZSB0byB0aGUgYFRPTUJTVE9ORURgIHN0YXR1cyB3aGVuIG5vIGZ1cnRoZXIgdHJhbnNhY3Rpb25zIHdlcmUgZm91bmQgYXQgdGhlIG5leHQgZXhwZWN0ZWQgZGF0ZS4gIGBVTktOT1dOYDogQSBzdHJlYW0gaXMgYXNzaWduZWQgYW4gYFVOS05PV05gIHN0YXR1cyB3aGVuIG5vbmUgb2YgdGhlIG90aGVyIHN0YXR1c2VzIGFyZSBhcHBsaWNhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25TdHJlYW1TdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgTWF0dXJlID0gJ01BVFVSRScsXG4gICAgRWFybHlEZXRlY3Rpb24gPSAnRUFSTFlfREVURUNUSU9OJyxcbiAgICBUb21ic3RvbmVkID0gJ1RPTUJTVE9ORUQnXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9ucyBjYXRlZ29yeSBydWxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcnVsZSBjcmVhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgSXRlbSB0aGUgcnVsZSB3YXMgY3JlYXRlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSBydWxlIHdhcyBjcmVhdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IHVuaXF1ZSBpZGVudGlmaWVyLiAgSW4gdGhlIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdGF4b25vbXksIHRoaXMgZmllbGQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzPzogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9ucyAoYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHJhdyB0cmFuc2FjdGlvbnMgdG8gYmUgZW5oYW5jZWQuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZW5oYW5jZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbmhhbmNlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGZvciB0aGUgcmVxdWVzdGVkIHRyYW5zYWN0aW9ucyAoZWl0aGVyIGBkZXBvc2l0b3J5YCBvciBgY3JlZGl0YCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHRyYW5zYWN0aW9uIG9iamVjdHMgdG8gYmUgZW5yaWNoZWQgYnkgUGxhaWQuIE1heGltdW0gb2YgMTAwIHRyYW5zYWN0aW9ucyBwZXIgcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGBsZWdhY3lfY2F0ZWdvcnlgIGFuZCBgbGVnYWN5X2NhdGVnb3J5X2lkYCBpbiB0aGUgcmVzcG9uc2UgKGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCkuICBDYXRlZ29yaWVzIGFyZSBiYXNlZCBvbiBQbGFpZFxcJ3MgbGVnYWN5IHRheG9ub215LiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9sZWdhY3lfY2F0ZWdvcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbnJpY2hlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5yaWNoZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gc2tpcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSByYXcgdW5wYXJzZWQgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24gZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIGZpZWxkIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIElmIHlvdSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHBhcnNlZCBkYXRhIHByb3ZpZGVkLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLCBvciBzdWJtaXQgYSBbU3VwcG9ydCByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcHJvZHVjdC1mdW5jdGlvbmFsaXR5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyB0byBjYWxscyBmb3IgSXRlbXMgdGhhdCB3ZXJlIG5vdCBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyBkdXJpbmcgTGluayBhbmQgYXJlIG5vdyBhZGRpbmcgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IHRvIHRoZSBJdGVtIGZvciB0aGUgZmlyc3QgdGltZS4gSW4gdGhlc2UgY2FzZXMsIHRoaXMgb3B0aW9uIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3IgZGV2ZWxvcGVyIGFjY291bnRzIGNyZWF0ZWQgYWZ0ZXIgRGVjZW1iZXIgMywgMjAyMywgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA5MCBkYXlzLiBGb3IgZGV2ZWxvcGVyIGFjY291bnRzIGNyZWF0ZWQgb24gRGVjZW1iZXIgMywgMjAyMyBvciBlYXJsaWVyLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDczMCBkYXlzIHVudGlsIEp1bmUgMjQsIDIwMjQsIGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgZGVmYXVsdCB0byA5MCBkYXlzLiAgSWYgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gcHJpb3IgdG8gdGhpcyBjYWxsLCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuICBXZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCBjdXN0b21lcnMgdXRpbGl6aW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IGZvciBvcHRpbWFsIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGBhY2NvdW50c2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGZvciB3aGljaCB0cmFuc2FjdGlvbnMgYXJlIGJlaW5nIHJldHVybmVkLiBFYWNoIHRyYW5zYWN0aW9uIGNhbiBiZSBtYXBwZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYWNjb3VudCB2aWEgdGhlIGBhY2NvdW50X2lkYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSURzIG9mIGFsbCB0aGUgdHJhbnNhY3Rpb25zIHRoYXQgd2lsbCBiZSBtZXJnZWQgaW50byBvbmUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0cyBpbiBhbm90aGVyIHN0cmVhbSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG90aGVyIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IGRlZmluZWQgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFN0cmVhbXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIE90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zPzogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGRlcG9zaXRvcnkgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZXhwZW5zZSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRyYW5zYWN0aW9uIHN0cmVhbXMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IHdlcmUgdXBkYXRlZCBvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9kYXRldGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQge1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBmaXJzdCBzdHJlYW0uIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmV0YWluIHRoZSBzdHJlYW1faWQgb2YgdGhlIGZpcnN0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCB0aGUgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuIFRoaXMgd2lsbCBlaXRoZXIgYWxsIHN1Y2NlZWQgb3IgYWxsIGZhaWwuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQ+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERpcmVjdGx5IG1vZGlmaWVkIHN0cmVhbSwgYWxvbmcgd2l0aCBvdGhlciBzdHJlYW1zIHdpdGggdHJhbnNhY3Rpb25zIHJlbW92ZWQgZnJvbSB0aGVtIGFzIGEgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZF9zdHJlYW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXQgZGVmaW5lcyBhIHNpbmdsZSBvcGVyYXRpb24gdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL3VwZGF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHN0cmVhbSB0aGF0IGFsbCB0aGUgdHJhbnNhY3Rpb25zIHdpbGwgYmUgYWRkZWQgaW4gdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXRcbiAgICAgKi9cbiAgICBzdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIGFkZGVkIGludG8gdGhlIHN0cmVhbS4gSWYgYW55IHRyYW5zYWN0aW9uIGN1cnJlbnRseSBleGlzdCBpbiBhbm90aGVyIHN0cmVhbSwgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG90aGVyIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL3VwZGF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdHJhbnNhY3Rpb24ocykgZm9yIGFuIEl0ZW0gYXJlIGRlbGV0ZWQuIFRoZSBkZWxldGVkIHRyYW5zYWN0aW9uIElEcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdlYmhvb2sgcGF5bG9hZC4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIGRlbGV0ZWQgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU19SRU1PVkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgdHJhbnNhY3Rpb25faWRzYCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlbW92ZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdHJhbnNhY3Rpb25zIHJ1bGUgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZUZpZWxkfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIGZpZWxkOiBUcmFuc2FjdGlvbnNSdWxlRmllbGQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zYWN0aW9uc1J1bGVUeXBlO1xuICAgIC8qKlxuICAgICAqIEZvciBUUkFOU0FDVElPTl9JRCBmaWVsZCwgcHJvdmlkZSB0cmFuc2FjdGlvbl9pZC4gRm9yIE5BTUUgZmllbGQsIHByb3ZpZGUgYSBzdHJpbmcgcGF0dGVybi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZURldGFpbHNcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBmaWVsZCBmb3Igd2hpY2ggdGhlIHJ1bGUgaXMgZGVmaW5lZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVGaWVsZCB7XG4gICAgVHJhbnNhY3Rpb25JZCA9ICdUUkFOU0FDVElPTl9JRCcsXG4gICAgTmFtZSA9ICdOQU1FJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uIHJ1bGVcXCdzIG1hdGNoIHR5cGUuIEZvciBUUkFOU0FDVElPTl9JRCBmaWVsZCwgRVhBQ1RfTUFUQ0ggaXMgYXZhaWxhYmxlLiBNYXRjaGVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbnNSdWxlVHlwZSB7XG4gICAgRXhhY3RNYXRjaCA9ICdFWEFDVF9NQVRDSCcsXG4gICAgU3Vic3RyaW5nTWF0Y2ggPSAnU1VCU1RSSU5HX01BVENIJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYGJldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgZGV0YWlsZWQgY2F0ZWdvcnkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGFuZCBhY2N1cmF0ZSBjYXRlZ29yaXphdGlvbi4gIFNlZSB0aGUgW2B0YXhvbm9teSBjc3YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfZGV0YWlsczogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlOiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9uIHJ1bGVzXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZXM6IEFycmF5PFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBydWxlXFwncyB1bmlxdWUgaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBUaGUgY3Vyc29yIGFsc28gYWNjZXB0cyB0aGUgc3BlY2lhbCB2YWx1ZSBvZiBgXFxcIm5vd1xcXCJgLCB3aGljaCBjYW4gYmUgdXNlZCB0byBmYXN0LWZvcndhcmQgdGhlIGN1cnNvciBhcyBwYXJ0IG9mIG1pZ3JhdGluZyBhbiBleGlzdGluZyBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBzeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gTm90ZSB0aGF0IHVzaW5nIHRoZSBgXFxcIm5vd1xcXCJgIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSB1c2UgY2FzZSBvdGhlciB0aGFuIG1pZ3JhdGluZyBleGlzdGluZyBJdGVtcyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAuICBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgZmllbGQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgcGFyc2VkIGRhdGEgcHJvdmlkZWQsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIgb3Igc3VibWl0IGEgW1N1cHBvcnQgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3Byb2R1Y3QtZnVuY3Rpb25hbGl0eSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9sb2dvX2FuZF9jb3VudGVycGFydHlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB0aGF0IHdlcmUgbm90IGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIGR1cmluZyBMaW5rIGFuZCBhcmUgbm93IGFkZGluZyB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgdG8gdGhlIEl0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcHRpb24gY29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0aGF0IFBsYWlkIHdpbGwgcmVxdWVzdCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBhZnRlciBEZWNlbWJlciAzLCAyMDIzLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBvbiBEZWNlbWJlciAzLCAyMDIzIG9yIGVhcmxpZXIsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gNzMwIGRheXMgdW50aWwgSnVuZSAyNCwgMjAyNCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuICBJZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBwcmlvciB0byB0aGlzIGNhbGwsIHRoaXMgZmllbGQgd2lsbCBoYXZlIG5vIGVmZmVjdC4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB1dGlsaXppbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZGVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIG9uIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS4gVGhlIGN1cnNvciBvYnRhaW5lZCBhZnRlciBhbGwgcGFnZXMgaGF2ZSBiZWVuIHB1bGxlZCAoaW5kaWNhdGVkIGJ5IGBoYXNfbW9yZWAgYmVpbmcgYGZhbHNlYCkgd2lsbCBiZSB2YWxpZCBmb3IgYXQgbGVhc3QgMSB5ZWFyLiBUaGlzIGN1cnNvciBzaG91bGQgYmUgcGVyc2lzdGVkIGZvciBsYXRlciBjYWxscy4gSWYgdHJhbnNhY3Rpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGNsaWVudC1wcm92aWRlZCB1c2VyX2lkIHRvIHJldHJpZXZlIGluc2lnaHRzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJEYXRhT3ZlcnZpZXd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9kYXRhX292ZXJ2aWV3OiBVc2VyRGF0YU92ZXJ2aWV3O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHlfaW5zaWdodHM/OiBDb3VudGVycGFydHlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F0ZWdvcnlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pbnNpZ2h0cz86IENhdGVnb3J5SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNhY3Rpb25zPzogUmVjdXJyaW5nVHJhbnNhY3Rpb25zO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN3ZWVwX3N0YXR1cz86IFRyYW5zZmVyU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB5b3UgY2FuIHN0aWxsIGNhbmNlbCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgMyBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjAxLCBSMDIsIFIwMywgUjI5LiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YW5kYXJkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgNjEgYnVzaW5lc3MgZGF5cyBmcm9tIHNldHRsZW1lbnQgZGF0ZSBpbmRpY2F0aW5nIHRoZSBmb2xsb3dpbmcgQUNIIHJldHVybnMgY2FuIG5vIGxvbmdlciBoYXBwZW46IFIwNSwgUjA3LCBSMTAsIFIxMSwgUjUxLCBSMzMsIFIzNywgUjM4LCBSNTEsIFI1MiwgUjUzLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF9yZXR1cm5fd2luZG93OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBlY3RlZCBkYXRlIHdoZW4gdGhlIGZ1bGwgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciBzZXR0bGVzIGF0IHRoZSBjb25zdW1lcnPigJkgYWNjb3VudCwgaWYgdGhlIHRyYW5zZmVyIGlzIGNyZWRpdDsgb3IgYXQgdGhlIGN1c3RvbWVyXFwncyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LCBpZiB0aGUgdHJhbnNmZXIgaXMgZGViaXQuIE9ubHkgc2V0IGZvciBBQ0ggdHJhbnNmZXJzIGFuZCBpcyBudWxsIGZvciBub24tQUNIIHRyYW5zZmVycy4gT25seSBzZXQgZm9yIEFDSCB0cmFuc2ZlcnMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc2V0dGxlbWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IHByZXNlbnQgaWYgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcmVmdW5kcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZWZ1bmQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlZnVuZHM6IEFycmF5PFRyYW5zZmVyUmVmdW5kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBpZiB0aGlzIHRyYW5zZmVyIGJlbG9uZ3MgdG8gYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIHN3ZWVwIHNldHRsZW1lbnQgc2NoZWR1bGUgb2YgdGhpcyB0cmFuc2ZlciwgYXNzdW1pbmcgdGhpcyB0cmFuc2ZlciBpcyBub3QgYHJldHVybmVkYC4gT25seSBhcHBsaWVzIHRvIEFDSCBkZWJpdCB0cmFuc2ZlcnMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGV4cGVjdGVkX3N3ZWVwX3NldHRsZW1lbnRfc2NoZWR1bGU/OiBBcnJheTxUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U6IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBkZWR1Y3QgZnJvbSBgdHJhbnNmZXIuYW1vdW50YCBhbmQgZGlzdHJpYnV0ZSB0byB0aGUgcGxhdGZvcm3igJlzIExlZGdlciBiYWxhbmNlIGFzIGEgZmFjaWxpdGF0b3IgZmVlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFRoZSByZW1haW5kZXIgd2lsbCBnbyB0byB0aGUgZW5kLWN1c3RvbWVy4oCZcyBMZWRnZXIgYmFsYW5jZS4gVGhpcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYHRyYW5zZmVyLmFtb3VudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWNpbGl0YXRvcl9mZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gQ3VycmVudGx5LCB0aGUgZmllbGQgd2lsbCByZW1haW4gbnVsbCBmb3IgdHJhbnNmZXJzIG9uIG90aGVyIHJhaWxzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBBQ0ggbmV0d29ya3MgdXNlZCBmb3IgdGhlIGZ1bmRzIGZsb3cuICBGb3IgcmVxdWVzdHMgc3VibWl0dGVkIGFzIGVpdGhlciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0aGUgY3V0b2ZmIGZvciBzYW1lLWRheSBpcyAzOjMwIFBNIEVhc3Rlcm4gVGltZSBhbmQgdGhlIGN1dG9mZiBmb3IgbmV4dC1kYXkgdHJhbnNmZXJzIGlzIDU6MzAgUE0gRWFzdGVybiBUaW1lLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzdWJtaXQgYSByZXF1ZXN0IGF0IGxlYXN0IDE1IG1pbnV0ZXMgYmVmb3JlIHRoZSBjdXRvZmYgdGltZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGN1dG9mZi4gQW55IHJlcXVlc3QgdGhhdCBpcyBpbmRpY2F0ZWQgYXMgYHNhbWUtZGF5LWFjaGAgYW5kIHRoYXQgbWlzc2VzIHRoZSBzYW1lLWRheSBjdXRvZmYsIGJ1dCBpcyBzdWJtaXR0ZWQgaW4gdGltZSBmb3IgdGhlIG5leHQtZGF5IGN1dG9mZiwgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckFDSE5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9uIGZvciBhIHByb3Bvc2VkIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHJlcHJlc2VudGluZyB3aGVuIHRoZSBhdXRob3JpemF0aW9uIHdhcyBjcmVhdGVkLCBpbiB0aGUgZm9ybWF0IGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2t9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfcmlzazogVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBwcm9wb3NlZF90cmFuc2ZlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2Zlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIFNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcyBvbmx5LiBJZiB1c2luZyBQbGFpZCBMZWRnZXIsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIGFuZCB5b3UgYXJlIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gT3RoZXJ3aXNlLCBQbGFpZCBMZWRnZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJlcXVpcmVkIGlmIG5vdCB1c2luZyBgYWNjZXNzX3Rva2VuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBhdXRob3JpemF0aW9uLCB3aGljaCBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIGF1dGhvcml6YXRpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0aG9yaXphdGlvbiBpcyBjcmVhdGVkLiAgVGhpcyBpZGVtcG90ZW5jeSBrZXkgZXhwaXJlcyBhZnRlciA0OCBob3VycywgYWZ0ZXIgd2hpY2ggdGhlIHNhbWUga2V5IGNhbiBiZSByZXVzZWQuIEZhaWx1cmUgdG8gcHJvdmlkZSB0aGlzIGtleSBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSBjaGFyZ2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbmQgdXNlciBpcyBpbml0aWF0aW5nIHRoZSBzcGVjaWZpYyB0cmFuc2ZlciB0aGVtc2VsdmVzIHZpYSBhbiBpbnRlcmFjdGl2ZSBVSSwgdGhpcyBzaG91bGQgYmUgYHRydWVgOyBmb3IgYXV0b21hdGljIHJlY3VycmluZyBwYXltZW50cyB3aGVyZSB0aGUgZW5kIHVzZXIgaXMgbm90IGFjdHVhbGx5IGluaXRpYXRpbmcgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyLCBpdCBzaG91bGQgYmUgYGZhbHNlYC4gVGhpcyBmaWVsZCBpcyBub3QgY3VycmVudGx5IHVzZWQgYW5kIGlzIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRvIGBmYWxzZWAsIFBsYWlkIHdpbGwgbm90IG9mZmVyIGEgYGd1YXJhbnRlZV9kZWNpc2lvbmAgZm9yIHRoaXMgcmVxdWVzdCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdpdGhfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIHJldHVybmVkIGJ5IFBsYWlkXFwncyBbYmVhY29uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2d1YXJhbnRlZS8jdXNpbmctYS1iZWFjb24pIHdoZW4gaXQgaXMgcnVuIG9uIHlvdXIgd2VicGFnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3Nlc3Npb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IG5lZWRlZCBpZiBjcmVhdGluZyB0cmFuc2ZlcnMgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U/OiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYGF1dGhvcml6YXRpb25gIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgYXBwcm92ZWRgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSB0byByZS1hdXRoZW50aWNhdGUgeW91ciB1c2VyIHdoZW4gYGRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgSVRFTV9MT0dJTl9SRVFVSVJFRGApLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuICBgZGVjbGluZWRgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRGVjbGluZWQgPSAnZGVjbGluZWQnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHJlZ2FyZGluZyBhIHByb3Bvc2VkIHRyYW5zZmVyLiBJdCBpcyBhbHdheXMgc2V0IGZvciBgZGVjbGluZWRgIGRlY2lzaW9ucywgYW5kIG1heSBvciBtYXkgbm90IGJlIG51bGwgZm9yIGBhcHByb3ZlZGAgZGVjaXNpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zZmVyIGFwcHJvdmFsIG9yIHRyYW5zZmVyIGRlY2xpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbGUgZm9yIGFwcHJvdmluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgSWYgdGhlIGByYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgcGFzc2VkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLiAgQW55IG5vbi1gbnVsbGAgdmFsdWUgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4gYW5kIHRoYXQgeW91IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgYXNzZXNzbWVudCBvbiB0aGUgdHJhbnNmZXIuIFRoZSBjb2RlIHdpbGwgaW5kaWNhdGUgd2h5IHRoZSBjaGVjayBjb3VsZCBub3QgYmUgcnVuLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgYXJlOiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIOKAkyBJdGVtIGNyZWF0ZWQgdmlhIHNhbWUtZGF5IG1pY3JvIGRlcG9zaXRzLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIEl0ZW0gc3RhbGVuZXNzLiBDYW4gYmUgcmVzb2x2ZWQgYnkgdXNpbmcgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgYE1JR1JBVEVEX0FDQ09VTlRfSVRFTWAgLSBJdGVtIGNyZWF0ZWQgdmlhIGAvdHJhbnNmZXIvYWNjb3VudF9taWdyYXRpb25gIGVuZHBvaW50LCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBFUlJPUmAg4oCTIFVuYWJsZSB0byBjb2xsZWN0IHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIGR1ZSB0byBhbiB1bnNwZWNpZmllZCBlcnJvci4gIFRoZSBmb2xsb3dpbmcgY29kZXMgaW5kaWNhdGUgdGhhdCB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiB3YXMgYGRlY2xpbmVkYDogIGBOU0ZgIOKAkyBUcmFuc2FjdGlvbiBsaWtlbHkgdG8gcmVzdWx0IGluIGEgcmV0dXJuIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUklTS2AgLSBUcmFuc2FjdGlvbiBpcyBoaWdoLXJpc2suICBgVFJBTlNGRVJfTElNSVRfUkVBQ0hFRGAgLSBPbmUgb3Igc2V2ZXJhbCB0cmFuc2ZlciBsaW1pdHMgYXJlIHJlYWNoZWQsIGUuZy4gbW9udGhseSB0cmFuc2ZlciBsaW1pdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZSB7XG4gICAgTnNmID0gJ05TRicsXG4gICAgUmlzayA9ICdSSVNLJyxcbiAgICBUcmFuc2ZlckxpbWl0UmVhY2hlZCA9ICdUUkFOU0ZFUl9MSU1JVF9SRUFDSEVEJyxcbiAgICBNYW51YWxseVZlcmlmaWVkSXRlbSA9ICdNQU5VQUxMWV9WRVJJRklFRF9JVEVNJyxcbiAgICBJdGVtTG9naW5SZXF1aXJlZCA9ICdJVEVNX0xPR0lOX1JFUVVJUkVEJyxcbiAgICBQYXltZW50UHJvZmlsZUxvZ2luUmVxdWlyZWQgPSAnUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgTWlncmF0ZWRBY2NvdW50SXRlbSA9ICdNSUdSQVRFRF9BQ0NPVU5UX0lURU0nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uIFRoZXNlIGZpZWxkcyBhcmUgbm90IGN1cnJlbnRseSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZztcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIGlzIGd1YXJhbnRlZWQgYnkgUGxhaWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuIFRoaXMgZmllbGQgd2lsbCBjb250YWluIGVpdGhlciBgR1VBUkFOVEVFRGAgb3IgYE5PVF9HVUFSQU5URUVEYCBpbmRpY2F0aW5nIHdoZXRoZXIgUGxhaWQgd2lsbCBndWFyYW50ZWUgdGhlIHRyYW5zZmVyLiBJZiB0aGUgdHJhbnNmZXIgaXMgbm90IGd1YXJhbnRlZWQsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBwcm92aWRlZCBpbiB0aGUgYGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGVgIGZpZWxkLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIGBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlYCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHtcbiAgICBHdWFyYW50ZWVkID0gJ0dVQVJBTlRFRUQnLFxuICAgIE5vdEd1YXJhbnRlZWQgPSAnTk9UX0dVQVJBTlRFRUQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgcmF0aW9uYWxlIGZvciBQbGFpZFxcJ3MgZGVjaXNpb24gdG8gbm90IGd1YXJhbnRlZSBhIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCB1bmxlc3MgYGd1YXJhbnRlZV9kZWNpc2lvbmAgaXMgYE5PVF9HVUFSQU5URUVEYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBjb2RlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhlIHRyYW5zZmVyIGNhbm5vdCBiZSBndWFyYW50ZWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cbi8qKlxuICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIFBsYWlkIGRlY2xpbmVkIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyOiAgYFJFVFVSTl9CQU5LYDogVGhlIHJpc2sgb2YgYSBiYW5rLWluaXRpYXRlZCByZXR1cm4gKGZvciBleGFtcGxlLCBhbiBSMDEvTlNGKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBSRVRVUk5fQ1VTVE9NRVJgOiBUaGUgcmlzayBvZiBhIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gKGZvciBleGFtcGxlLCBhIFIxMC9VbmF1dGhvcml6ZWQpIGlzIHRvbyBoaWdoIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyLiAgYEdVQVJBTlRFRV9MSU1JVF9SRUFDSEVEYDogVGhpcyB0cmFuc2ZlciBpcyBsb3ctcmlzaywgYnV0IEd1YXJhbnRlZSBoYXMgZXhoYXVzdGVkIGFuIGludGVybmFsIGxpbWl0IG9uIHRoZSBudW1iZXIgb3IgcmF0ZSBvZiBndWFyYW50ZWVzIHRoYXQgYXBwbGllcyB0byB0aGlzIHRyYW5zZmVyLiAgYFJJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEVgOiBBIHJpc2sgZXN0aW1hdGUgaXMgdW5hdmFpbGFibGUgZm9yIHRoaXMgSXRlbS4gIGBSRVFVSVJFRF9QQVJBTV9NSVNTSU5HYDogUmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlIHtcbiAgICBSZXR1cm5CYW5rID0gJ1JFVFVSTl9CQU5LJyxcbiAgICBSZXR1cm5DdXN0b21lciA9ICdSRVRVUk5fQ1VTVE9NRVInLFxuICAgIEd1YXJhbnRlZUxpbWl0UmVhY2hlZCA9ICdHVUFSQU5URUVfTElNSVRfUkVBQ0hFRCcsXG4gICAgUmlza0VzdGltYXRlVW5hdmFpbGFibGUgPSAnUklTS19FU1RJTUFURV9VTkFWQUlMQUJMRScsXG4gICAgUmVxdWlyZWRQYXJhbU1pc3NpbmcgPSAnUkVRVUlSRURfUEFSQU1fTUlTU0lORydcbn1cblxuLyoqXG4gKiBUaGlzIG9iamVjdCBpbmNsdWRlcyB0aGUgc2NvcmVzIGFuZCByaXNrIGxldmVsLiBUaGlzIHJlc3BvbnNlIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhlc2UgZmllbGRzIHBsZWFzZSBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuICBUaGUgc2NvcmUgZXZhbHVhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBiZWNhdXNlIGFuIGFjY291bnQgaXMgb3ZlcmRyYXduIG9yIGJlY2F1c2UgYW4gaW5lbGlnaWJsZSBhY2NvdW50IGlzIHVzZWQgYW5kIGNvdmVycyByZXR1cm4gY29kZXM6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICBiYW5rX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0IGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjA1XFxcIiwgXFxcIlIwN1xcXCIsIFxcXCJSMTBcXFwiLCBcXFwiUjExXFxcIiwgXFxcIlIyOVxcXCIuIFRoZXNlIHJldHVybnMgdHlwaWNhbGx5IGhhdmUgYSByZXR1cm4gdGltZSBmcmFtZSBvZiB1cCB0byA2MCBjYWxlbmRhciBkYXlzLiBEdXJpbmcgdGhpcyBwZXJpb2QsIHRoZSBjdXN0b21lciBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGNhbiBkaXNwdXRlIGEgdHJhbnNhY3Rpb24gYXMgdW5hdXRob3JpemVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9zY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw6IFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNyZWRpdF9mdW5kc19zb3VyY2U6IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG59XG4vKipcbiAqIENvbXByaXNlcyBmaXZlIHJpc2sgY2F0ZWdvcmllcyAoaGlnaCByaXNrLCBtZWRpdW0taGlnaCByaXNrLCBtZWRpdW0gcmlzaywgbWVkaXVtLWxvdyByaXNrLCBsb3cgcmlzaykgYmFzZWQgb24gdGhlIHByb2JhYmlsaXR5IG9mIHJldHVyblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsIHtcbiAgICBIaWdoUmlzayA9ICdISUdIX1JJU0snLFxuICAgIE1lZGl1bUhpZ2hSaXNrID0gJ01FRElVTV9ISUdIX1JJU0snLFxuICAgIE1lZGl1bVJpc2sgPSAnTUVESVVNX1JJU0snLFxuICAgIE1lZGl1bUxvd1Jpc2sgPSAnTUVESVVNX0xPV19SSVNLJyxcbiAgICBMb3dSaXNrID0gJ0xPV19SSVNLJ1xufVxuXG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLiBUaGUgYHVzZXIubGVnYWxfbmFtZWAgZmllbGQgaXMgcmVxdWlyZWQuIE90aGVyIGZpZWxkcyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGFuZCBhcmUgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLiBJZiB0aGUgdXNlciBpcyBhIGJ1c2luZXNzLCBwcm92aWRlIHRoZSBidXNpbmVzcyBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Q7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoaXMgYmFsYW5jZSBhdmFpbGFibGUgZm9yIHVzZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmFpbGFibGUgYmFsYW5jZSwgcGx1cyBhbW91bnQgb2YgcGVuZGluZyBmdW5kcyB0aGF0IGluIHByb2Nlc3NpbmcgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFsYW5jZS4gIGBwcmVmdW5kZWRfcnRwX2NyZWRpdHNgIC0gWW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJCYWxhbmNlVHlwZSB7XG4gICAgUnRwQ3JlZGl0cyA9ICdwcmVmdW5kZWRfcnRwX2NyZWRpdHMnLFxuICAgIEFjaENyZWRpdHMgPSAncHJlZnVuZGVkX2FjaF9jcmVkaXRzJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyB0aGUgc3VwcG9ydGVkIHNlcnZpY2UgdHlwZXMgaW4gUlRQXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgbGlua2VkIEl0ZW1cXCdzIGluc3RpdHV0aW9uIHN1cHBvcnRzIFJUUCBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQXG4gICAgICovXG4gICAgY3JlZGl0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc3VwcG9ydGVkX25ldHdvcmtzOiBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIGNyZWRpdCB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIGRlYml0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfZGFpbHlfY3JlZGl0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBhbmQgZGViaXQgdHJhbnNmZXJzIGluIG9uZSBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIGBhdXRob3JpemF0aW9uX2lkYCBpcyBub3cgdXNlZCBhcyBpZGVtcG90ZW5jeSBpbnN0ZWFkLiAgQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gVGhpcyBwYXJhbWV0ZXIgYWxzbyBzZXJ2ZXMgdGhlIHB1cnBvc2Ugb2YgYWN0aW5nIGFzIGFuIGlkZW1wb3RlbmN5IGlkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuIElmIHJlcHJvY2Vzc2luZyBhIHJldHVybmVkIHRyYW5zZmVyLCBwbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkIG11c3QgYmUgYFxcXCJSZXRyeSAxXFxcImAgb3IgYFxcXCJSZXRyeSAyXFxcImAgdG8gaW5kaWNhdGUgdGhhdCBpdFxcJ3MgYSByZXRyeSBvZiBhIHByZXZpb3VzbHkgcmV0dXJuZWQgdHJhbnNmZXIuIFlvdSBtYXkgcmV0cnkgYSB0cmFuc2ZlciB1cCB0byAyIHRpbWVzLCB3aXRoaW4gMTgwIGRheXMgb2YgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIHRyYW5zZmVyLiBPbmx5IHRyYW5zZmVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2l0aCBjb2RlIGBSMDFgIG9yIGBSMDlgIG1heSBiZSByZXRyaWVkLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1c2VyPzogVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYHRyYW5zZmVyYCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gZGVkdWN0IGZyb20gYHRyYW5zZmVyLmFtb3VudGAgYW5kIGRpc3RyaWJ1dGUgdG8gdGhlIHBsYXRmb3Jt4oCZcyBMZWRnZXIgYmFsYW5jZSBhcyBhIGZhY2lsaXRhdG9yIGZlZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGUgcmVtYWluZGVyIHdpbGwgZ28gdG8gdGhlIGVuZC1jdXN0b21lcuKAmXMgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGB0cmFuc2Zlci5hbW91bnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBub3cgZGVwcmVjYXRlZC4gWW91IG1heSBpZ25vcmUgaXQgZm9yIHRyYW5zZmVycyBjcmVhdGVkIG9uIGFuZCBhZnRlciAxMi8wMS8yMDIzLiAgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgZnVuZHMgZm9yIHRoZSB0cmFuc2Zlci4gT25seSB2YWxpZCBmb3IgYGNyZWRpdGAgdHJhbnNmZXJzLCBhbmQgZGVmYXVsdHMgdG8gYHN3ZWVwYCBpZiBub3Qgc3BlY2lmaWVkLiBUaGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGBkZWJpdGAgdHJhbnNmZXJzLiAgYHN3ZWVwYCAtIFN3ZWVwIGZ1bmRzIGZyb20geW91ciBmdW5kaW5nIGFjY291bnQgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgQUNIIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2Uge1xuICAgIFN3ZWVwID0gJ3N3ZWVwJyxcbiAgICBQcmVmdW5kZWRSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgUHJlZnVuZGVkQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGNyZWRpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgY3JlZGl0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfZnJlcXVlbmN5OiBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgaGlnaGVzdCBhbW91bnQgZm9yIGEgc2luZ2xlIGNyZWRpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2hpZ2hlc3RfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGF2ZXJhZ2UgYW1vdW50IHBlciBjcmVkaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBtb250aGx5IGV4cGVjdGVkIEFDSCBjcmVkaXQgcHJvY2Vzc2luZyBhbW91bnQgZm9yIHRoZSBuZXh0IDYtMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfbW9udGhseV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGV4cGVjdGVkIHVzZSBjYXNlcyBmb3IgdGhlIG9yaWdpbmF0b3LigJlzIGNyZWRpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlLmcuIGJpbGwgcGF5bWVudCAgYFxcXCJ3ZWJcXFwiYCAtIEEgY3JlZGl0IEVudHJ5IGluaXRpYXRlZCBieSBvciBvbiBiZWhhbGYgb2YgYSBob2xkZXIgb2YgYSBDb25zdW1lciBBY2NvdW50IHRoYXQgaXMgaW50ZW5kZWQgZm9yIGEgQ29uc3VtZXIgQWNjb3VudCBvZiBhIFJlY2VpdmVyXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFDSENsYXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PENyZWRpdEFDSENsYXNzPjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB1c2FnZSBvZiBkZWJpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgZGViaXQgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9mcmVxdWVuY3k6IE9yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBoaWdoZXN0IGFtb3VudCBmb3IgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2hpZ2hlc3RfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGF2ZXJhZ2UgYW1vdW50IHBlciBkZWJpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgbW9udGhseSBleHBlY3RlZCBBQ0ggZGViaXQgcHJvY2Vzc2luZyBhbW91bnQgZm9yIHRoZSBuZXh0IDYtMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgdXNlIGNhc2VzIGZvciB0aGUgb3JpZ2luYXRvcuKAmXMgZGViaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gdGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lciwgZWcuIGJpbGwgcGF5bWVudCAgYFxcXCJ0ZWxcXFwiYCAtIFRlbGVwaG9uZS1Jbml0aWF0ZWQgRW50cnkgIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkgLSBkZWJpdHMgZnJvbSBhIGNvbnN1bWVy4oCZcyBhY2NvdW50IHdoZXJlIHRoZWlyIGF1dGhvcml6YXRpb24gaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VjX2NvZGVzOiBBcnJheTxBQ0hDbGFzcz47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGV2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRvY3VtZW50IHRoYXQgeW91IHdhbnQgdG8gdXBsb2FkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZpbGUgdG8gdXBsb2FkLiBUaGUgZmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuIDIwTUIuIFN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnM6IC5wZGYuXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBmaWxlOiBhbnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRG9jdW1lbnRQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHB1cnBvc2U6IFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9y4oCZcyBkaWxpZ2VuY2Ugc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXMge1xuICAgIE5vdFN1Ym1pdHRlZCA9ICdub3Rfc3VibWl0dGVkJyxcbiAgICBTdWJtaXR0ZWQgPSAnc3VibWl0dGVkJyxcbiAgICBVbmRlclJldmlldyA9ICd1bmRlcl9yZXZpZXcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZW5pZWQgPSAnZGVuaWVkJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgdGhlIG9yaWdpbmF0b3Igd2hvc2UgZGlsaWdlbmNlIHRoYXQgeW91IHdhbnQgdG8gc3VibWl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9kaWxpZ2VuY2U6IFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBwdXJwb3NlIG9mIHRoZSB1cGxvYWRlZCBmaWxlLiAgYFxcXCJEVUVfRElMSUdFTkNFXFxcImAgLSBUaGUgdHJhbnNmZXIgZHVlIGRpbGlnZW5jZSBkb2N1bWVudCBvZiB0aGUgb3JpZ2luYXRvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlIHtcbiAgICBEdWVEaWxpZ2VuY2UgPSAnRFVFX0RJTElHRU5DRSdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV2ZW50IGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV2ZW50LiBJRHMgYXJlIHNlcXVlbnRpYWwgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zZmVyLiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLiBUaGlzIGZpZWxkIGlzIGBudWxsYCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPbWl0dGFibGVUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl90eXBlPzogT21pdHRhYmxlVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFRoaXMgZmllbGQgaXMgb21pdHRlZCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfYW1vdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2lnbmVkIGFtb3VudCBvZiBob3cgbXVjaCB3YXMgYHN3ZXB0YCBvciBgcmV0dXJuX3N3ZXB0YCBmb3IgdGhpcyB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCItNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBzd2VlcF9hbW91bnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC4gQSBub24tbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGV2ZW50IGlzIGZvciB0aGUgYXNzb2NpYXRlZCByZWZ1bmQgb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSB0cmFuc2ZlciB0aGF0IHRoaXMgZXZlbnQgYXBwbGllcyB0by4gT25seSBwcmVzZW50IGlmIHRoZSB0cmFuc2ZlciB3YXMgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8vZnJvbSBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IFRyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZXM/OiBBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRpb24gYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciB0cmFuc2ZlcnMgZnJvbSBhIHNwZWNpZmljIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgeW91ciBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIHRyYW5zZmVyIHJlcHJlc2VudHMuIEV2ZW50IHR5cGVzIHdpdGggcHJlZml4IGBzd2VlcGAgcmVwcmVzZW50cyBldmVudHMgZm9yIFBsYWlkIExlZGdlciBzd2VlcHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGBzZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLiAgYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlcHRfc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBjdXN0b21lcuKAmXMgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudC4gIGByZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHRyYW5zZmVyIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBmcm9tIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiAgYHN3ZWVwLnBlbmRpbmdgOiBBIG5ldyBsZWRnZXIgc3dlZXAgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHN3ZWVwLnBvc3RlZGA6IFRoZSBsZWRnZXIgc3dlZXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHN3ZWVwLnNldHRsZWRgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIGZ1bmRpbmcgYWNjb3VudC4gVGhpcyBtZWFucyB0aGF0IGZ1bmRzIHdpdGhkcmF3biBmcm9tIFBsYWlkIExlZGdlciBiYWxhbmNlIGhhdmUgcmVhY2hlZCB0aGUgZnVuZGluZyBhY2NvdW50LCBvciBmdW5kcyB0byBiZSBkZXBvc2l0ZWQgaW50byB0aGUgUGxhaWQgTGVkZ2VyIEJhbGFuY2UgaGF2ZSBiZWVuIHB1bGxlZCwgYW5kIHRoZSBob2xkIHBlcmlvZCBoYXMgYmVndW4uICBgc3dlZXAucmV0dXJuZWRgOiBBIHBvc3RlZCBsZWRnZXIgc3dlZXAgd2FzIHJldHVybmVkLiAgYHN3ZWVwLmZhaWxlZGA6IFRoZSBsZWRnZXIgc3dlZXAgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wZW5kaW5nYDogQSBuZXcgcmVmdW5kIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGByZWZ1bmQuY2FuY2VsbGVkYDogVGhlIHJlZnVuZCB3YXMgY2FuY2VsbGVkLiAgYHJlZnVuZC5mYWlsZWRgOiBUaGUgcmVmdW5kIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGByZWZ1bmQucG9zdGVkYDogVGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmVmdW5kLnNldHRsZWRgOiBUaGUgcmVmdW5kIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGluIHRoZSBQbGFpZCBsaW5rZWQgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuZWRgOiBBIHBvc3RlZCByZWZ1bmQgd2FzIHJldHVybmVkLiAgYHJlZnVuZC5zd2VwdGA6IFRoZSByZWZ1bmQgd2FzIHN3ZXB0IGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgcmVmdW5kLnJldHVybl9zd2VwdGA6IER1ZSB0byB0aGUgcmVmdW5kIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgU3dlcHQgPSAnc3dlcHQnLFxuICAgIFN3ZXB0U2V0dGxlZCA9ICdzd2VwdF9zZXR0bGVkJyxcbiAgICBSZXR1cm5Td2VwdCA9ICdyZXR1cm5fc3dlcHQnLFxuICAgIFN3ZWVwUGVuZGluZyA9ICdzd2VlcC5wZW5kaW5nJyxcbiAgICBTd2VlcFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFN3ZWVwU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBTd2VlcFJldHVybmVkID0gJ3N3ZWVwLnJldHVybmVkJyxcbiAgICBTd2VlcEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZWZpbmVzIGFuIGV4cGVjdGVkIHN3ZWVwIGRhdGUgYW5kIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVtZW50IGRhdGUgb2YgYSBzd2VlcCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgc3dlZXBfc2V0dGxlbWVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY3VtdWxhdGVkIGFtb3VudCB0aGF0IGhhcyBiZWVuIHN3ZXB0IGJ5IGBzd2VlcF9zZXR0bGVtZW50X2RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VwdF9zZXR0bGVkX2Ftb3VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIGV2ZW50IHR5cGUgZm9yIGEgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBmdW5kaW5nIGFjY291bnQsIGxpbmtlZCB3aXRoIFBsYWlkIExpbmsgb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiAgQSBkZWNpc2lvbiByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgYEFQUFJPVkVEYCDigJMgVGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyByZWNlaXZlZCB0aGUgZW5kIHVzZXJcXCdzIGNvbnNlbnQgYW5kIGhhcyBiZWVuIGFwcHJvdmVkIGZvciBwcm9jZXNzaW5nIGJ5IFBsYWlkLiBUaGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgZmllbGQgaXMgc2V0IGlmIFBsYWlkIHdhcyB1bmFibGUgdG8gZmV0Y2ggdGhlIGFjY291bnQgaW5mb3JtYXRpb24uIFlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IGZ1cnRoZXIgcmV2aWV3IGlzIHJlY29tbWVuZGVkIChpLmUuLCB1c2UgTGluayBpbiB1cGRhdGUgdG8gcmUtYXV0aGVudGljYXRlIHlvdXIgdXNlciB3aGVuIGBkZWNpc2lvbl9yYXRpb25hbGUuY29kZWAgaXMgYElURU1fTE9HSU5fUkVRVUlSRURgKS4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYERFQ0xJTkVEYCDigJMgUGxhaWQgcmV2aWV3ZWQgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGFuZCBkZWNsaW5lZCBwcm9jZXNzaW5nLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIERlY2xpbmVkID0gJ0RFQ0xJTkVEJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2ZlciBpbnRlbnQgd2l0aGluIFRyYW5zZmVyIFVJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlckludGVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJldHVybmVkIG9ubHkgaWYgYGFjY291bnRfaWRgIHdhcyBzZXQgb24gaW50ZW50IGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhlIGludGVudC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBhY2NvdW50IHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIG1vZGU6IFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgdHJhbnNmZXIuIE1heGltdW0gb2YgOCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSB0cmFuc2ZlciByZXF1aXJlcyBhIGBHVUFSQU5URUVEYCBkZWNpc2lvbiBieSBQbGFpZCB0byBwcm9jZWVkIChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIHJlcXVpcmVfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIGZsb3cgb2YgdHJhbnNmZXIgZnVuZHMuICBgUEFZTUVOVGA6IFRyYW5zZmVycyBmdW5kcyBmcm9tIGFuIGVuZCB1c2VyXFwncyBhY2NvdW50IHRvIHlvdXIgYnVzaW5lc3MgYWNjb3VudC4gIGBESVNCVVJTRU1FTlRgOiBUcmFuc2ZlcnMgZnVuZHMgZnJvbSB5b3VyIGJ1c2luZXNzIGFjY291bnQgdG8gYW4gZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudENyZWF0ZU1vZGUge1xuICAgIFBheW1lbnQgPSAnUEFZTUVOVCcsXG4gICAgRGlzYnVyc2VtZW50ID0gJ0RJU0JVUlNFTUVOVCdcbn1cblxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuIERlZmF1bHRzIHRvIGBzYW1lLWRheS1hY2hgLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYGFjaGAsIHRoZSBuZXh0LWRheSBjdXRvZmYgaXMgNTozMCBQTSBFYXN0ZXJuIFRpbWUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgc2FtZS1kYXktYWNoYCwgdGhlIHNhbWUtZGF5IGN1dG9mZiBpcyAzOjMwIFBNIEVhc3Rlcm4gVGltZS4gSWYgdGhlIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhZnRlciB0aGlzIGN1dG9mZiBidXQgYmVmb3JlIHRoZSBuZXh0LWRheSBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzOyB0aGlzIHdpbGwgYXBwbHkgdG8gYm90aCBsZWdzIG9mIHRoZSB0cmFuc2ZlciBpZiBhcHBsaWNhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBTaG91bGQgYmUgc3BlY2lmaWVkIGlmIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMgb25seS4gSWYgdXNpbmcgUGxhaWQgTGVkZ2VyLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayBhbmQgeW91IGFyZSB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIE90aGVyd2lzZSwgUGxhaWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1vZGU6IFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgdHJhbnNmZXIuIE1heGltdW0gb2YgOCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50OiBUcmFuc2ZlckludGVudENyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlckludGVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBjcmVhdGVkIHRocm91Z2ggdGhlIFVJLiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHJlYXNvbiBmb3IgYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50LiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBpbnRlbnQgc3RhdHVzIGlzIGBmYWlsZWRgLiBOdWxsIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBmb3IgYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50IChpLmUuLCBhbiBBUEkgZXJyb3Igb3IgdGhlIGF1dGhvcml6YXRpb24gYmVpbmcgZGVjbGluZWQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50R2V0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBpbnRlbnQuICBgUEVORElOR2A6IFRoZSB0cmFuc2ZlciBpbnRlbnQgaXMgcGVuZGluZy4gYFNVQ0NFRURFRGA6IFRoZSB0cmFuc2ZlciBpbnRlbnQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBgRkFJTEVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgdW5hYmxlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBTdWNjZWVkZWQgPSAnU1VDQ0VFREVEJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgYXJlIGluIHByb2Nlc3NpbmcgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBwZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBjdXN0b21lciB0aGF0IG93bnMgdGhlIExlZGdlciBiYWxhbmNlLiBUaGlzIGlzIHNvIFBsYWlkIGtub3dzIHdoaWNoIG9mIHlvdXIgY3VzdG9tZXJzIHRvIHBheW91dCBvciBjb2xsZWN0IGZ1bmRzLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtQbGF0Zm9ybSBjdXN0b21lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuIERvIG5vdCBpbmNsdWRlIGlmIHlvdeKAmXJlIHBheWluZyBvdXQgdG8geW91cnNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGZ1bmRpbmcgYWNjb3VudCBsaW5rZWQgdG8gdGhpcyBQbGFpZCBMZWRnZXIgdG8gdXNlLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvciwgYW5kIGlmIGBmdW5kaW5nX2FjY291bnRfaWRgIGlzIGxlZnQgYmxhbmssIHRoZSBvcmlnaW5hdG9yXFwncyBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBvc2l0aXZlIGFtb3VudCBvZiBob3cgbXVjaCB3aWxsIGJlIGRlcG9zaXRlZCBpbnRvIGxlZGdlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCI1LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciBkZXBvc2l0LiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgdGhlIHJlcXVlc3Qgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgZGVwb3NpdCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBQ0hOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJBQ0hOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IHRvIHB1bGwgbW9uZXkgZnJvbS4gTXVzdCBiZSB0aGUgcGxhdGZvcm0gaXRzZWxmIG9yIGl0cyBvcmlnaW5hdG9yLiBPbmUgb2YgYGZyb21fY2xpZW50X2lkYCBhbmQgYHRvX2NsaWVudF9pZGAgbXVzdCBiZSB0aGUgcGxhdGZvcm1cXCdzIGBjbGllbnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcm9tX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgdG8gY3JlZGl0IG1vbmV5IHRvLiBNdXN0IGJlIHRoZSBwbGF0Zm9ybSBpdHNlbGYgb3IgaXRzIG9yaWdpbmF0b3IuIE9uZSBvZiBgZnJvbV9jbGllbnRfaWRgIGFuZCBgdG9fY2xpZW50X2lkYCBtdXN0IGJlIHRoZSBwbGF0Zm9ybVxcJ3MgYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRvX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gbW92ZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRpc3RyaWJ1dGUuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGlzdHJpYnV0ZSBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkaXN0cmlidXRlIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgbGVkZ2VyIGRpc3RyaWJ1dGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJMZWRnZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYHNldHRsZWRgLCBgZmFpbGVkYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgbGVkZ2VyIHN3ZWVwIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLnBvc3RlZGAgIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLmZhaWxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAuc2V0dGxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAucmV0dXJuZWRgICBgc3dlZXAuc2V0dGxlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGUge1xuICAgIFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc3dlZXAuc2V0dGxlZCcsXG4gICAgUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgY3VzdG9tZXIgdGhhdCBvd25zIHRoZSBMZWRnZXIgYmFsYW5jZS4gVGhpcyBpcyBzbyBQbGFpZCBrbm93cyB3aGljaCBvZiB5b3VyIGN1c3RvbWVycyB0byBwYXlvdXQgb3IgY29sbGVjdCBmdW5kcy4gT25seSBhcHBsaWNhYmxlIGZvciBbUGxhdGZvcm0gY3VzdG9tZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLiBEbyBub3QgaW5jbHVkZSBpZiB5b3XigJlyZSBwYXlpbmcgb3V0IHRvIHlvdXJzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IGxpbmtlZCB0byB0aGlzIFBsYWlkIExlZGdlciB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIElmIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAgaXMgc3BlY2lmaWVkLCB0aGUgYGZ1bmRpbmdfYWNjb3VudF9pZGAgbXVzdCBiZWxvbmcgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yLCBhbmQgaWYgYGZ1bmRpbmdfYWNjb3VudF9pZGAgaXMgbGVmdCBibGFuaywgdGhlIG9yaWdpbmF0b3JcXCdzIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBvc2l0aXZlIGFtb3VudCBvZiBob3cgbXVjaCB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBsZWRnZXIgYmFsYW5jZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCI1LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIHdpdGhkcmF3LiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgdGhlIHJlcXVlc3Qgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdpdGhkcmF3IGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIG9yaWdpbmF0ZWQgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyczogQXJyYXk8VHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1vbnRobHlfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudCAoYGNoZWNraW5nYCBvciBgc2F2aW5nc2ApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBhY2hgLCB0aGUgbmV4dC1kYXkgY3V0b2ZmIGlzIDU6MzAgUE0gRWFzdGVybiBUaW1lLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHNhbWUtZGF5LWFjaGAsIHRoZSBzYW1lLWRheSBjdXRvZmYgaXMgMzozMCBQTSBFYXN0ZXJuIFRpbWUuIElmIHRoZSB0cmFuc2ZlciBpcyBzdWJtaXR0ZWQgYWZ0ZXIgdGhpcyBjdXRvZmYgYnV0IGJlZm9yZSB0aGUgbmV4dC1kYXkgY3V0b2ZmLCBpdCB3aWxsIGJlIHNlbnQgb3ZlciBuZXh0LWRheSByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlczsgdGhpcyB3aWxsIGFwcGx5IHRvIGJvdGggbGVncyBvZiB0aGUgdHJhbnNmZXIgaWYgYXBwbGljYWJsZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBydHBgLCAgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IHJvdXRlIGJldHdlZW4gUmVhbCBUaW1lIFBheW1lbnQgcmFpbCBieSBUQ0ggb3IgRmVkTm93IHJhaWxzIGFzIG5lY2Vzc2FyeS4gSWYgYSB0cmFuc2ZlciBpcyBzdWJtaXR0ZWQgYXMgYHJ0cGAgYW5kIHRoZSBjb3VudGVycGFydHkgYWNjb3VudCBpcyBub3QgZWxpZ2libGUgZm9yIFJUUCwgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHJlcXVlc3Qgd2lsbCBmYWlsIHdpdGggYW4gYElOVkFMSURfRklFTERgIGVycm9yIGNvZGUuIFRvIHByZS1jaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvdW50ZXJwYXJ0eSBhY2NvdW50IGNhbiBzdXBwb3J0IFJUUCwgY2FsbCBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGJlZm9yZSBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCdcbn1cblxuLyoqXG4gKiBUaGUgb3JpZ2luYXRvclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0d28tbGV0dGVyIGNvZGUgZm9yIHRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSAoZS5nLiwgXFxcIjk0MTAzXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyIGJlaW5nIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcHVibGljLWZhY2luZyBzdXJmYWNlcywgZS5nLiBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvci4gVGhpcyBpZGVudGlmaWVyIHdpbGwgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyBhbmQgc2hvdWxkIGJlIHN0b3JlZCBhc3NvY2lhdGVkIHdpdGggZW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBkYmE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IElEIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHRheF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgY3JlZGl0X3VzYWdlX2NvbmZpZ3VyYXRpb24/OiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRlYml0X3VzYWdlX2NvbmZpZ3VyYXRpb24/OiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgYWRkcmVzczogVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE5BSUNTIGNvZGUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgbmFpY3NfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZ1bmRpbmdBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnQ6IFRyYW5zZmVyRnVuZGluZ0FjY291bnQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZ1bmRpbmdBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnQ6IFRyYW5zZmVyRnVuZGluZ0FjY291bnQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lciAoaS5lLiB0aGUgb3JpZ2luYXRvcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RldGFpbGVkT3JpZ2luYXRvcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yOiBEZXRhaWxlZE9yaWdpbmF0b3I7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG9yaWdpbmF0b3JzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG9yaWdpbmF0b3JzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3JpZ2luYXRvcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JzOiBBcnJheTxPcmlnaW5hdG9yPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSTCB0aGUgZW5kIGN1c3RvbWVyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBhZnRlciBjb21wbGV0aW5nIHF1ZXN0aW9ucyBpbiBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVUkwgdGhhdCB5b3Ugd2lsbCByZWRpcmVjdCB0aGUgZW5kIGN1c3RvbWVyIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgb25ib2FyZGluZ191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVjdXJyaW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgcmVjdXJyaW5nIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgY3JlYXRlZCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gTmV3IG9yaWdpbmF0aW9ucyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBgdGVzdF9jbG9ja2AgYWR2YW5jZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyRGV2aWNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyPzogUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVjaXNpb25fcmF0aW9uYWxlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2ZlcjogUmVjdXJyaW5nVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJzOiBBcnJheTxSZWN1cnJpbmdUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmUgZXhlY3V0ZWQgb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfdW5pdDogVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlY3VycmluZyBgaW50ZXJ2YWxfdW5pdHNgIGJldHdlZW4gb3JpZ2luYXRpb25zLiBUaGUgcmVjdXJyaW5nIGludGVydmFsIChiZWZvcmUgaG9saWRheSBhZGp1c3RtZW50KSBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIGBpbnRlcnZhbF91bml0YCBhbmQgYGludGVydmFsX2NvdW50YC4gRm9yIGV4YW1wbGUsIHRvIHNjaGVkdWxlIGEgcmVjdXJyaW5nIHRyYW5zZmVyIHdoaWNoIG9yaWdpbmF0ZXMgb25jZSBldmVyeSB0d28gd2Vla3MsIHNldCBgaW50ZXJ2YWxfdW5pdGAgPSBgd2Vla2AgYW5kIGBpbnRlcnZhbF9jb3VudGAgPSAyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSB0cmFuc2Zlci4gIElmIHRoZSBgaW50ZXJ2YWxfdW5pdGAgaXMgYHdlZWtgLCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDUgKEZyaWRheSkuICBJZiB0aGUgYGludGVydmFsX3VuaXRgIGlzIGBtb250aGAsIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgdHJhbnNmZXIgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgdHJhbnNmZXIgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSB0cmFuc2ZlciByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHRyYW5zZmVyIG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgdHJhbnNmZXIgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uICBUaGUgdHJhbnNmZXIgd2lsbCBiZSBvcmlnaW5hdGVkIG9uIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpZiB0aGUgZGVzaWduYXRlZCBkYXkgaXMgYSBub24gYmFua2luZyBkYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci4gIGBhY3RpdmVgOiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGN1cnJlbnRseSBhY3RpdmUuIGBjYW5jZWxsZWRgOiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudCBvciBQbGFpZC4gYGV4cGlyZWRgOiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQgYWxsIG9yaWdpbmF0aW9ucyBhY2NvcmRpbmcgdG8gaXRzIHJlY3VycmluZyBzY2hlZHVsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyUmVjdXJyaW5nU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlZnVuZCB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNmZXIgdG8gcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSByZWZ1bmQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVyUmVmdW5kU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyUmVmdW5kRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyByZWZ1bmQgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gQ3VycmVudGx5LCB0aGUgZmllbGQgd2lsbCByZW1haW4gbnVsbCBmb3IgdHJhbnNmZXJzIG9uIG90aGVyIHJhaWxzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNmZXIgdG8gcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcmVmdW5kIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVmdW5kLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgcmVmdW5kIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHJlZnVuZCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZDogVHJhbnNmZXJSZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgZXZlbnQgdHlwZSBmb3IgYSByZWZ1bmQgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kRmFpbHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHJlZnVuZCBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZDogVHJhbnNmZXJSZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHJlZnVuZC4gIGBwZW5kaW5nYDogQSBuZXcgcmVmdW5kIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gYHBvc3RlZGA6IFRoZSByZWZ1bmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiBgc2V0dGxlZGA6IENyZWRpdHMgaGF2ZSBiZWVuIHJlZnVuZGVkIHRvIHRoZSBQbGFpZCBsaW5rZWQgYWNjb3VudC4gYGNhbmNlbGxlZGA6IFRoZSByZWZ1bmQgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiBgZmFpbGVkYDogVGhlIHJlZnVuZCBoYXMgZmFpbGVkLiBgcmV0dXJuZWRgOiBUaGUgcmVmdW5kIHdhcyByZXR1cm5lZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyUmVmdW5kU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFNldHRsZWQgPSAnc2V0dGxlZCcsXG4gICAgUmV0dXJuZWQgPSAncmV0dXJuZWQnXG59XG5cbi8qKlxuICogQSByZXBheW1lbnQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIG9uZSBvciBtb3JlIGd1YXJhbnRlZWQgdHJhbnNhY3Rpb25zIHJlY2VpdmUgYSByZXR1cm4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGlnaWJsZSByZXR1cm5zIGluIGEgZGF5LCB0aGV5IGFyZSBiYXRjaGVkIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgcmVwYXltZW50LiAgUmVwYXltZW50cyBhcmUgc2VudCBvdmVyIEFDSCwgd2l0aCBmdW5kcyB0eXBpY2FsbHkgYXZhaWxhYmxlIG9uIHRoZSBuZXh0IGJhbmtpbmcgZGF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSByZXBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICByZXBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgcmVwYXltZW50IG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGVjaW1hbCBhbW91bnQgb2YgdGhlIHJlcGF5bWVudCBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgYWNjb3VudCBsZWRnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHJlcGF5bWVudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlcGF5bWVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwYXltZW50czogQXJyYXk8VHJhbnNmZXJSZXBheW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHJldHVybiBvbiBhIEd1YXJhbnRlZWQgQUNIIHRyYW5zZmVyIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZ3VhcmFudGVlZCB0cmFuc2ZlciB0aGF0IHdhcyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGByZXR1cm5lZGAgdHJhbnNmZXIgZXZlbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHJlcGF5bWVudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudCB0byBxdWVyeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnRzL3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9yZXR1cm5zOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBzd2VlcCBvZiBmdW5kcyB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBBIHN3ZWVwIGlzIGFzc29jaWF0ZWQgd2l0aCBtYW55IHN3ZWVwIGV2ZW50cyAoZXZlbnRzIG9mIHR5cGUgYHN3ZXB0YCBvciBgcmV0dXJuX3N3ZXB0YCkgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCBieSBpbnZva2luZyB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBzd2VlcF9pZGAuICBgc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIHRoZSB0cmFuc2ZlciBhbW91bnQgaXMgY3JlZGl0ZWQgb3IgZGViaXRlZCBmcm9tIHlvdXIgc3dlZXAgYWNjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSBgdHlwZWAgb2YgdGhlIHRyYW5zZmVyLiBgcmV0dXJuX3N3ZXB0YCBldmVudHMgb2NjdXIgd2hlbiBhIHRyYW5zZmVyIGlzIHJldHVybmVkIGFuZCBQbGFpZCB1bmRvZXMgdGhlIGNyZWRpdCBvciBkZWJpdC4gIFRoZSB0b3RhbCBzdW0gb2YgdGhlIGBzd2VwdGAgYW5kIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBpcyBlcXVhbCB0byB0aGUgYGFtb3VudGAgb2YgdGhlIHN3ZWVwIFBsYWlkIGNyZWF0ZXMgYW5kIG1hdGNoZXMgdGhlIGFtb3VudCBvZiB0aGUgZW50cnkgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gQ3VycmVudGx5LCB0aGUgZmllbGQgd2lsbCByZW1haW4gbnVsbCBmb3IgdHJhbnNmZXJzIG9uIG90aGVyIHJhaWxzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN3ZWVwIChVVUlEKSBvciBhIHNob3J0ZW5lZCBmb3JtIGNvbnNpc3Rpbmcgb2YgdGhlIGZpcnN0IDggY2hhcmFjdGVycyBvZiB0aGUgaWRlbnRpZmllciAoOC1kaWdpdCBoZXhhZGVjaW1hbCBzdHJpbmcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzd2VlcHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBpbmNsdWRlZCBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PFRyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBzd2VlcCBmb3IgdGhlIHRyYW5zZmVyLiAgYHVuc3dlcHRgOiBUaGUgdHJhbnNmZXIgaGFzblxcJ3QgYmVlbiBzd2VwdCB5ZXQuIGBzd2VwdGA6IFRoZSB0cmFuc2ZlciB3YXMgc3dlcHQgdG8gdGhlIHN3ZWVwIGFjY291bnQuIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiBgcmV0dXJuX3N3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdWxsZWQgYmFjayBvciBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC4gYG51bGxgOiBUaGUgdHJhbnNmZXIgd2lsbCBuZXZlciBiZSBzd2VwdCAoZS5nLiBpZiB0aGUgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIG9yIHJldHVybmVkIGJlZm9yZSBiZWluZyBzd2VwdClcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3dlZXBTdGF0dXMge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgVW5zd2VwdCA9ICd1bnN3ZXB0JyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB0ZXN0IGNsb2NrIGZvciBhIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclRlc3RDbG9ja1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJUZXN0Q2xvY2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclRlc3RDbG9ja1xuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmlydHVhbCB0aW1lc3RhbXAgb24gdGhlIHRlc3QgY2xvY2suIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdmlydHVhbF90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB0aGUgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeC4gXFxcIlNhbiBGcmFuY2lzY29cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Q7XG59XG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgZWRpdGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgIHdlYmhvb2sgaXMgZmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGUgdXNlciBjYW4gcmVzdG9yZSBhY2Nlc3MgdG8gdGhlIHJldm9rZWQgYWNjb3VudCBieSByZWdyYW50aW5nIHBlcm1pc3Npb25zIG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgaW4gYmV0YS4gSXQgd2lsbCBiZSBhdmFpbGFibGUgaW4gR0EgaW4gSmFuIDIwMjQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfQUNDT1VOVF9SRVZPS0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSB1c2VyLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogbm90IHByb3ZpZGVkLCBhZGRyZXNzIHdpdGggb25seSBjb3VudHJ5IGNvZGUgb3IgZnVsbCBhZGRyZXNzLiAgRm9yIG1vcmUgY29udGV4dCBvbiB0aGlzIGZpZWxkLCBzZWUgW0lucHV0IFZhbGlkYXRpb24gYnkgQ291bnRyeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24vI2lucHV0LXZhbGlkYXRpb24tYnktY291bnRyeSkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIHRoZSB1c2VyIGhhcyBzdWJtaXR0ZWQgdGhlaXIgYWRkcmVzcywgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDdXN0b21QYXNzd29yZCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlcklETnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYCB3ZWJob29rIG1heSBiZSBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyB1c2VkIGVpdGhlciB0aGUgW215LnBsYWlkLmNvbSBwb3J0YWxdKGh0dHBzOi8vbXkucGxhaWQuY29tKSBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9u4oCZcyBPQXV0aCBjb25zZW50IHBvcnRhbCB0byByZXZva2UgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gVGhpcyB3ZWJob29rIGlzIG5vdCBndWFyYW50ZWVkIHRvIGFsd2F5cyBiZSBmaXJlZCB1cG9uIGNvbnNlbnQgcmV2b2NhdGlvbiwgc2luY2Ugc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gT25jZSBhY2Nlc3MgdG8gYW4gSXRlbSBoYXMgYmVlbiByZXZva2VkLCBpdCBjYW5ub3QgYmUgcmVzdG9yZWQuIElmIHRoZSB1c2VyIHN1YnNlcXVlbnRseSByZXR1cm5zIHRvIHlvdXIgYXBwbGljYXRpb24sIGEgbmV3IEl0ZW0gbXVzdCBiZSBjcmVhdGVkIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5IHtcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IGZyZXF1ZW5jeSBvZiBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IHR5cGUgLSBgR1JPU1NgLCBgTkVUYCwgb3IgYFVOS05PV05gIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBHcm9zcyA9ICdHUk9TUycsXG4gICAgTmV0ID0gJ05FVCdcbn1cblxuLyoqXG4gKiBVc2VyVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eT86IENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWYWxpZGF0aW9uU291cmNlXG4gICAgICovXG4gICAgVmFsaWRhdGlvblNvdXJjZVJlZmVyZW5jZUlkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxWYWxpZGF0aW9uU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZXNcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRTogQXJyYXk8VmFsaWRhdGlvblNvdXJjZT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSB3YXMgbm90IHZlcmlmaWVkIHZpYSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdHMgYWZ0ZXIgc2V2ZW4gZGF5cyBzaW5jZSB0aGUgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXQgd2FzIG1hZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9FWFBJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRpbmdJbmZvcm1hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogUmVwb3J0aW5nSW5mb3JtYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnR9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlQ6IFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVF9SRVNQT05TRTogVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0c31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBBc3NldHM7XG59XG4vKipcbiAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVEFUVVNfVVNFUl9QUkVTRU5DRV9SRVFVSVJFRFxcXCJgIFVzZXIgcHJlc2VuY2UgaXMgcmVxdWlyZWQgdG8gcmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uLiBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUxcXFwiYCBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoIHdhcyBzdWNjZXNzZnVsLiBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORFxcXCJgIE5vIG5ldyBkYXRhIHdhcyBmb3VuZCBhZnRlciB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uUmVmcmVzaFN0YXR1cyB7XG4gICAgU3RhdHVzVXNlclByZXNlbmNlUmVxdWlyZWQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRUQnLFxuICAgIFN1Y2Nlc3NmdWwgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1VDQ0VTU0ZVTCcsXG4gICAgTm90Rm91bmQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfTk9UX0ZPVU5EJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJRURcXFwiYDogVGhlIGluZm9ybWF0aW9uIHdhcyBzdWNjZXNzZnVsbHkgdmVyaWZpZWQuICBgXFxcIlVOVkVSSUZJRURcXFwiYDogVGhlIHZlcmlmaWNhdGlvbiBoYXMgbm90IHlldCBiZWVuIHBlcmZvcm1lZC4gIGBcXFwiTkVFRFNfSU5GT1xcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHdhcyBhdHRlbXB0ZWQgYnV0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIG1pc3NpbmcgaW5mb3JtYXRpb24uICBcXFwiYFVOQUJMRV9UT19WRVJJRllgXFxcIjogVGhlIHZlcmlmaWNhdGlvbiB3YXMgcGVyZm9ybWVkIGFuZCB0aGUgaW5mb3JtYXRpb24gY291bGQgbm90IGJlIHZlcmlmaWVkLiAgYFxcXCJVTktOT1dOXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIFZlcmlmaWVkID0gJ1ZFUklGSUVEJyxcbiAgICBVbnZlcmlmaWVkID0gJ1VOVkVSSUZJRUQnLFxuICAgIE5lZWRzSW5mbyA9ICdORUVEU19JTkZPJyxcbiAgICBVbmFibGVUb1ZlcmlmeSA9ICdVTkFCTEVfVE9fVkVSSUZZJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogVzIgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBpbmNvbWUgZGF0YSB0YWtlbiBmcm9tIGEgVzIgdGF4IGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVzIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llZT86IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggeWVhciBvZiB0aGUgVzIgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZWUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV93YWdlcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSBtZWRpY2FyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvY2F0ZWQgdGlwcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGJveF85Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOb25xdWFsaWZpZWQgcGxhbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyPn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfMTI/OiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJldGlyZW1lbnQgcGxhbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHJldGlyZW1lbnRfcGxhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcmQgcGFydHkgc2ljayBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBvdGhlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz47XG59XG4vKipcbiAqIERhdGEgb24gdGhlIFcyIEJveCAxMlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMkJveDEyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXMkJveDEyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVzIgQm94IDEyIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJCb3gxMlxuICAgICAqL1xuICAgIGNvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJCb3gxMlxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBTdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdhZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGVtcGxveWVyX3N0YXRlX2lkX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGVfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbF9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG59XG4vKipcbiAqIFdhbGxldENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogV2FsbGV0QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgZS13YWxsZXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IFdhbGxldEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZSwgdXNlZCB3aXRoIGUtd2FsbGV0cyBhbmQgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0SVNPQ3VycmVuY3lDb2RlIHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJ1xufVxuXG4vKipcbiAqIFdhbGxldExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgZS13YWxsZXQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGF0IGUtd2FsbGV0LiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGUtd2FsbGV0cyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBlLXdhbGxldHMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBXYWxsZXRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGUtd2FsbGV0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRzOiBBcnJheTxXYWxsZXQ+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBlLXdhbGxldHMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCBlLXdhbGxldCBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldE51bWJlcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxJQkFOfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IHNjaGVtZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyB0cmFuc2FjdGlvbi4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQQVlPVVRgIGFuZCBgUkVGVU5EYC4gIGBGQVNURVJfUEFZTUVOVFNgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCBzY2hlbWUgd2l0aGluIHRoZSBVSy4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0UGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBGYXN0ZXJQYXltZW50cyA9ICdGQVNURVJfUEFZTUVOVFMnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHdhbGxldC4gIGBVTktOT1dOYDogVGhlIHdhbGxldCBzdGF0dXMgaXMgdW5rbm93bi4gIGBBQ1RJVkVgOiBUaGUgd2FsbGV0IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gc2VuZCBtb25leSB0byBhbmQgcmVjZWl2ZSBtb25leSBmcm9tLiAgYENMT1NFRGA6IFRoZSB3YWxsZXQgaXMgY2xvc2VkLiBBbnkgdHJhbnNhY3Rpb25zIG1hZGUgdG8gb3IgZnJvbSB0aGlzIHdhbGxldCB3aWxsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0U3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEFjdGl2ZSA9ICdBQ1RJVkUnLFxuICAgIENsb3NlZCA9ICdDTE9TRUQnXG59XG5cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9uIGRldGFpbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHdhbGxldCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQW1vdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciBmb3IgYSBXYWxsZXQgVHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHlcXCdzIGJhbmsgYWNjb3VudCBudW1iZXJzLiBFeGFjdGx5IG9uZSBvZiBJQkFOIG9yIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWx9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwgfCBudWxsO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLiBFbnN1cmUgdGhhdCB0aGUgYHJlZmVyZW5jZWAgZmllbGQgaXMgdW5pcXVlIGZvciBlYWNoIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZXJyb3IgY29kZSBvZiBhIGZhaWxlZCB0cmFuc2FjdGlvbi4gRXJyb3IgY29kZXMgaW5jbHVkZTogYEVYVEVSTkFMX1NZU1RFTWA6IFRoZSB0cmFuc2FjdGlvbiB3YXMgZGVjbGluZWQgYnkgYW4gZXh0ZXJuYWwgc3lzdGVtLiBgRVhQSVJFRGA6IFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGhhcyBleHBpcmVkLiBgQ0FOQ0VMTEVEYDogVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2FzIHJlc2NpbmRlZC4gYElOVkFMSURgOiBUaGUgdHJhbnNhY3Rpb24gZGlkIG5vdCBtZWV0IGNlcnRhaW4gY3JpdGVyaWEsIHN1Y2ggYXMgYW4gaW5hY3RpdmUgYWNjb3VudCBvciBubyB2YWxpZCBjb3VudGVycGFydHksIGV0Yy4gYFVOS05PV05gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIHVuc3VjY2Vzc2Z1bCwgYnV0IHRoZSBleGFjdCBjYXVzZSBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHtcbiAgICBFeHRlcm5hbFN5c3RlbSA9ICdFWFRFUk5BTF9TWVNURU0nLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCcsXG4gICAgQ2FuY2VsbGVkID0gJ0NBTkNFTExFRCcsXG4gICAgSW52YWxpZCA9ICdJTlZBTElEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYmFzZTY0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuIFNldCB0aGlzIHRvIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgZnJvbSB0aGUgcHJldmlvdXMgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhhdCB0cmFuc2FjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgd2FsbGV0IHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMgb2YgYW4gZS13YWxsZXQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHdhbGxldF9pZGBcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgdHJhbnNhY3Rpb24uIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gdHJhbnNhY3Rpb25zIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gQXNzZXQgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB3YXJuaW5nIGRhdGEgaW4gdGhlIHJlc3BvbnNlLCBpbmRpY2F0aW5nIHdoeSBvYnRhaW5pbmcgdGhlIG93bmVyIGluZm9ybWF0aW9uIGZhaWxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBBU1NFVF9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgT1dORVJTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuYElOVkVTVE1FTlRTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBJbnZlc3RtZW50cyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogV2FybmluZ1dhcm5pbmdDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F1c2V9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ2F1c2U7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBJbnZlc3RtZW50c1VuYXZhaWxhYmxlID0gJ0lOVkVTVE1FTlRTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBraW5kIG9mIG9mZmljaWFsIGRvY3VtZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LiAgYGJpcnRoX2NlcnRpZmljYXRlYCAtIEEgY2VydGlmaWNhdGUgb2YgYmlydGggIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBsaWNlbnNlIHRvIG9wZXJhdGUgYSBtb3RvciB2ZWhpY2xlICBgaW1taWdyYXRpb25fbnVtYmVyYCAtIEltbWlncmF0aW9uIG9yIHJlc2lkZW5jZSBkb2N1bWVudHMgIGBtaWxpdGFyeV9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYSBtaWxpdGFyeSBncm91cCAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcGFzc3BvcnRgIC0gQW4gb2ZmaWNpYWwgcGFzc3BvcnQgaXNzdWUgYnkgYSBnb3Zlcm5tZW50ICBgcGVyc29uYWxfaWRlbnRpZmljYXRpb25gIC0gQW55IGdlbmVyaWMgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gdGhhdCBpcyBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcmF0aW9uX2NhcmRgIC0gSWRlbnRpZmljYXRpb24gdGhhdCBlbnRpdGxlcyB0aGUgaG9sZGVyIHRvIHJhdGlvbnMgIGBzc25gIC0gVW5pdGVkIFN0YXRlcyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyICBgc3R1ZGVudF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYW4gZWR1Y2F0aW9uYWwgaW5zdGl0dXRpb24gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzICBgdHJhdmVsX2RvY3VtZW50YCAtIFZpc2FzLCBlbnRyeSBwZXJtaXRzLCByZWZ1Z2VlIGRvY3VtZW50cywgZXRjLiAgYHZvdGVyX2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygdm90aW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGUge1xuICAgIEJpcnRoQ2VydGlmaWNhdGUgPSAnYmlydGhfY2VydGlmaWNhdGUnLFxuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSW1taWdyYXRpb25OdW1iZXIgPSAnaW1taWdyYXRpb25fbnVtYmVyJyxcbiAgICBNaWxpdGFyeUlkID0gJ21pbGl0YXJ5X2lkJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFBlcnNvbmFsSWRlbnRpZmljYXRpb24gPSAncGVyc29uYWxfaWRlbnRpZmljYXRpb24nLFxuICAgIFJhdGlvbkNhcmQgPSAncmF0aW9uX2NhcmQnLFxuICAgIFNzbiA9ICdzc24nLFxuICAgIFN0dWRlbnRJZCA9ICdzdHVkZW50X2lkJyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnLFxuICAgIFRyYXZlbERvY3VtZW50ID0gJ3RyYXZlbF9kb2N1bWVudCcsXG4gICAgVm90ZXJJZCA9ICd2b3Rlcl9pZCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBlbnRpdHkgc2NyZWVuaW5nIHJldmlld1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBlbnRpdGllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxFbnRpdHlXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBlbnRpdHkgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIE9yZ2FuaXphdGlvbnNcXFwiIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RQcm9ncmFtPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbXM6IEFycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyByZXZpZXdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyByZXZpZXdzXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX3Jldmlld3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zPzogVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IG9yIFBFUCBsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pdmVyc2FsIGlkZW50aWZpZXIgZm9yIGEgd2F0Y2hsaXN0IGluZGl2aWR1YWwgdGhhdCBpcyBzdGFibGUgYWNyb3NzIHNlYXJjaGVzIGFuZCB1cGRhdGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHBsYWlkX3VpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2Ugc2FuY3Rpb24gb3Igd2F0Y2hsaXN0LiBXaGVuIG9uZSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgc291cmNlX3VpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogU2NyZWVuaW5nSGl0QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NjcmVlbmluZ0hpdERhdGF9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGRhdGE/OiBTY3JlZW5pbmdIaXREYXRhO1xufVxuLyoqXG4gKiBMb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbG9jYXRpb24gc3RyaW5nLCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgZWxlbWVudHMgbGlrZSBzdHJlZXQsIGNpdHksIHBvc3RhbCBjb2RlcyBhbmQgY291bnRyeSBjb2Rlcy4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgY29tcGxldGUgb3Igd2VsbC1mb3JtYXR0ZWQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHJldmlldy4gQWxsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0cyBiZWdpbiBpbiBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUgYnV0IGNhbiBiZSBjaGFuZ2VkIGJ5IGNyZWF0aW5nIGEgcmV2aWV3LiBXaGVuIGEgaGl0IGlzIGluIHRoZSBgcGVuZGluZ19yZXZpZXdgIHN0YXRlLCBpdCB3aWxsIGFsd2F5cyBzaG93IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgd2F0Y2hsaXN0IGRhdGEgUGxhaWQgaGFzIGF2YWlsYWJsZSBhbmQgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgbGF0ZXN0IGN1c3RvbWVyIGluZm9ybWF0aW9uIHNhdmVkIGluIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBPbmNlIGEgaGl0IGhhcyBiZWVuIG1hcmtlZCBhcyBgY29uZmlybWVkYCBvciBgZGlzbWlzc2VkYCBpdCB3aWxsIG5vIGxvbmdlciBiZSB1cGRhdGVkIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGFzIGl0IHdhcyB3aGVuIHRoZSByZXZpZXcgd2FzIGZpcnN0IGNvbmR1Y3RlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cyB7XG4gICAgQ29uZmlybWVkID0gJ2NvbmZpcm1lZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgRGlzbWlzc2VkID0gJ2Rpc21pc3NlZCdcbn1cblxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGNoYW5nZXMgdG8gd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmdpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHByb2dyYW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGluZGl2aWR1YWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgSW5kaXZpZHVhbHNcXFwiLCBcXFwiVVMgQ2FyZGhvbGRlcnNcXFwiLCBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXMgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1zOiBBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHJldmlld3MgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtcz86IFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgY3JlYXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHNjcmVlbmluZyBpcyBzdGlsbCBwZW5kaW5nIHJldmlldywgaGFzIGJlZW4gcmVqZWN0ZWQsIG9yIGhhcyBiZWVuIGNsZWFyZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXMge1xuICAgIFJlamVjdGVkID0gJ3JlamVjdGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBDbGVhcmVkID0gJ2NsZWFyZWQnXG59XG5cbi8qKlxuICogTmFtZXMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQgYXMgbG93IHF1YWxpdHkgZWl0aGVyIGJ5IHRoZWlyIGBzb3VyY2VgIGxpc3QsIG9yIGJ5IGBwbGFpZGAgYnkgYSBzZXJpZXMgb2YgYWRkaXRpb25hbCBjaGVja3MgZG9uZSBieSBQbGFpZC4gUGxhaWQgZG9lcyBub3QgZXZlciBzdXJmYWNlIGEgaGl0IGFzIGEgcmVzdWx0IG9mIGEgd2VhayBuYW1lIGFsb25lLiBJZiBhIG5hbWUgaGFzIG5vIHF1YWxpdHkgaXNzdWVzLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vbmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbiB7XG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBTb3VyY2UgPSAnc291cmNlJyxcbiAgICBQbGFpZCA9ICdwbGFpZCdcbn1cblxuLyoqXG4gKiBUaGUgUGxhaWQgZW52aXJvbm1lbnQgdGhlIHdlYmhvb2sgd2FzIHNlbnQgZnJvbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va0Vudmlyb25tZW50VmFsdWVzIHtcbiAgICBEZXZlbG9wbWVudCA9ICdkZXZlbG9wbWVudCcsXG4gICAgU2FuZGJveCA9ICdzYW5kYm94JyxcbiAgICBQcm9kdWN0aW9uID0gJ3Byb2R1Y3Rpb24nXG59XG5cbi8qKlxuICogVGhlIHdlYmhvb2sgdHlwZXMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgdGhpcyB0ZXN0IGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va1R5cGUge1xuICAgIEF1dGggPSAnQVVUSCcsXG4gICAgSG9sZGluZ3MgPSAnSE9MRElOR1MnLFxuICAgIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zID0gJ0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUycsXG4gICAgSXRlbSA9ICdJVEVNJyxcbiAgICBMaWFiaWxpdGllcyA9ICdMSUFCSUxJVElFUycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ1RSQU5TQUNUSU9OUycsXG4gICAgQXNzZXRzID0gJ0FTU0VUUydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIHdlYmhvb2sgaXMgdXBkYXRlZC4gVGhpcyB3aWxsIGJlIHNlbnQgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgbmV3X3dlYmhvb2tfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBJRCAoIGBraWRgICkgZnJvbSB0aGUgSldUIGhlYWRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGtleV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0pXS1B1YmxpY0tleX1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAga2V5OiBKV0tQdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIHByZS10YXggZWFybmluZ3MsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQ6IGFzeW5jIChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzQmFsYW5jZUdldCcsICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JywgYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQ6IGFzeW5jIChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzR2V0JywgJ2FjY291bnRzR2V0UmVxdWVzdCcsIGFjY291bnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0OiBhc3luYyAoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhcHBsaWNhdGlvbkdldCcsICdhcHBsaWNhdGlvbkdldFJlcXVlc3QnLCBhcHBsaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FwcGxpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0JywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydENyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRDcmVhdGUnLCAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcjogYXN5bmMgKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRGaWx0ZXInLCAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JywgYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZmlsdGVyYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0R2V0JywgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldDogYXN5bmMgKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRQZGZHZXQnLCAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaDogYXN5bmMgKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZWZyZXNoJywgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnLCBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZW1vdmUnLCAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQ6IGFzeW5jIChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2F1dGhHZXQnLCAnYXV0aEdldFJlcXVlc3QnLCBhdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQmFsYW5jZUdldCcsICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWw6IGFzeW5jIChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNhbmNlbCcsICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDcmVhdGUnLCAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRMaXN0JywgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRTeW5jJywgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckdldCcsICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYXNlUmVwb3J0R2V0OiBhc3luYyAoYmFzZVJlcG9ydEdldFJlcXVlc3Q6IEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Jhc2VSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYXNlUmVwb3J0R2V0JywgJ2Jhc2VSZXBvcnRHZXRSZXF1ZXN0JywgYmFzZVJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGU6IGFzeW5jIChiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydENyZWF0ZScsICdiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0JywgYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldDogYXN5bmMgKGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0R2V0JywgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0OiBhc3luYyAoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRMaXN0JywgJ2JlYWNvblJlcG9ydExpc3RSZXF1ZXN0JywgYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQnLCAnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0JywgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGU6IGFzeW5jIChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJDcmVhdGUnLCAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0OiBhc3luYyAoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyR2V0JywgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JywgYmVhY29uVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXc6IGFzeW5jIChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJSZXZpZXcnLCAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnLCBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvcmV2aWV3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZTogYXN5bmMgKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlclVwZGF0ZScsICdiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCcsIGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXRlZ29yaWVzR2V0OiBhc3luYyAoYm9keTogb2JqZWN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NhdGVnb3JpZXNHZXQnLCAnYm9keScsIGJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NhdGVnb3JpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUJhbmtJbmNvbWVHZXQnLCAnY3JhQmFua0luY29tZUdldFJlcXVlc3QnLCBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVHZXQnLCAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0OiBhc3luYyAoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lUGRmR2V0JywgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZVJlZnJlc2gnLCAnY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGU6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlJywgJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0OiBhc3luYyAoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQnLCAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEVtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEVtcGxveW1lbnRHZXQnLCAnY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QnLCBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQ6IGFzeW5jIChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0JywgJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCcsIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZUdldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChyZXF1ZXN0Qm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjazogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2gnLCAnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnQgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZTogYXN5bmMgKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlDcmVhdGUnLCAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JywgY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQ6IGFzeW5jIChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5R2V0JywgJ2NyZWRpdFJlbGF5R2V0UmVxdWVzdCcsIGNyZWRpdFJlbGF5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0OiBhc3luYyAoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVBkZkdldCcsICdjcmVkaXRSZWxheVBERkdldFJlcXVlc3QnLCBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlbW92ZTogYXN5bmMgKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZW1vdmUnLCAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JywgY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0U2Vzc2lvbnNHZXQ6IGFzeW5jIChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFNlc3Npb25zR2V0JywgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcsIGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3Nlc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJHZXQ6IGFzeW5jIChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJHZXQnLCAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnLCBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGRhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGRhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckxpc3Q6IGFzeW5jIChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJMaXN0JywgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcsIGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlOiBhc3luYyAoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldDogYXN5bmMgKGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaEdldCcsICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldCcsICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQ6IGFzeW5jIChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5R2V0JywgJ2lkZW50aXR5R2V0UmVxdWVzdCcsIGlkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaDogYXN5bmMgKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlNYXRjaCcsICdpZGVudGl0eU1hdGNoUmVxdWVzdCcsIGlkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBpZGVudGl0eSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGlkZW50aXR5IHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25HZXQnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBpZGVudGl0eSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeScsICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vcmV0cnlgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjaycsICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0OiBhc3luYyAoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXQnLCAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaDogYXN5bmMgKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zU2VhcmNoJywgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzQXV0aEdldCcsICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQ3JlYXRlUHVibGljVG9rZW4nLCAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldDogYXN5bmMgKGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUdldCcsICdpdGVtR2V0UmVxdWVzdCcsIGl0ZW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydDogYXN5bmMgKGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtSW1wb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUltcG9ydCcsICdpdGVtSW1wb3J0UmVxdWVzdCcsIGl0ZW1JbXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2ltcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtSW1wb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZTogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UnLCAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmU6IGFzeW5jIChpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1SZW1vdmUnLCAnaXRlbVJlbW92ZVJlcXVlc3QnLCBpdGVtUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlOiBhc3luYyAoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtV2ViaG9va1VwZGF0ZScsICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQ6IGFzeW5jIChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaWFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpYWJpbGl0aWVzR2V0JywgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcsIGxpYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUNyZWF0ZTogYXN5bmMgKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua0RlbGl2ZXJ5Q3JlYXRlJywgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnLCBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlHZXQ6IGFzeW5jIChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUdldCcsICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlOiBhc3luYyAobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UnLCAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcsIGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQ6IGFzeW5jIChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtUb2tlbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtUb2tlbkdldCcsICdsaW5rVG9rZW5HZXRSZXF1ZXN0JywgbGlua1Rva2VuR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGluay90b2tlbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua1Rva2VuR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckNyZWF0ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyQ3JlYXRlJywgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyUmVtb3ZlJywgJ3BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldCcsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UnLCAncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvcmV2ZXJzZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3Q6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlOiBhc3luYyAocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUNyZWF0ZScsICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldDogYXN5bmMgKHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVHZXQnLCAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmU6IGFzeW5jIChwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlUmVtb3ZlJywgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQ6IGFzeW5jIChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFjY291bnRHZXQnLCAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnLCBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldDogYXN5bmMgKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXV0aEdldCcsICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcsIHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldDogYXN5bmMgKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFsYW5jZUdldCcsICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcsIHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlJywgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldDogYXN5bmMgKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySWRlbnRpdHlHZXQnLCAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JywgcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQnLCAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQ6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYzogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYycsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9vaycsICdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbUZpcmVXZWJob29rJywgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtUmVzZXRMb2dpbicsICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzOiBhc3luYyAoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cycsICdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QnLCBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50czogYXN5bmMgKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMnLCAnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0Jywgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4nLCAnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QnLCBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQ6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Q6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3QnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxEZWNpc2lvblJlcG9ydCcsICdzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlOiBhc3luYyAoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxFdmFsdWF0ZScsICdzaWduYWxFdmFsdWF0ZVJlcXVlc3QnLCBzaWduYWxFdmFsdWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkOiBhc3luYyAoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzRG93bmxvYWQnLCAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcsIHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvZG93bmxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Q6IGFzeW5jIChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNMaXN0JywgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcsIHN0YXRlbWVudHNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbmhhbmNlOiBhc3luYyAodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNFbmhhbmNlJywgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2g6IGFzeW5jICh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VucmljaCcsICd0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2VucmljaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiBGb3Igb3B0aW1hbCByZXN1bHRzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgY3VzdG9tZXJzIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIGl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zICh1c2luZyB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIG9wdGlvbikuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVmcmVzaCcsICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlJywgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzTGlzdDogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNMaXN0JywgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlJywgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jICh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1N5bmMnLCAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0JywgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGU6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZScsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jICh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQmFsYW5jZUdldCcsICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWw6IGFzeW5jICh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FuY2VsJywgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0OiBhc3luYyAodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhcGFiaWxpdGllc0dldCcsICd0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QnLCB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0OiBhc3luYyAodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQnLCAndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCcsIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDcmVhdGUnLCAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkOiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkJywgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0OiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCcsICd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QnLCB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jICh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRMaXN0JywgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jOiBhc3luYyAodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50U3luYycsICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudENyZWF0ZScsICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQ6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVySW50ZW50R2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQ6IGFzeW5jICh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdCcsICd0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlOiBhc3luYyAodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUnLCAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyR2V0JywgJ3RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3OiBhc3luYyAodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlcldpdGhkcmF3JywgJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3Q6IGFzeW5jICh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGlzdCcsICd0cmFuc2Zlckxpc3RSZXF1ZXN0JywgdHJhbnNmZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1ldHJpY3NHZXQ6IGFzeW5jICh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTWV0cmljc0dldCcsICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JywgdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yR2V0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3Q6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3QnLCAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZScsICd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZScsICd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0dldCcsICd0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0xpc3Q6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdCcsICd0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENhbmNlbCcsICd0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlJywgJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRHZXQ6IGFzeW5jICh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kR2V0JywgJ3RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRMaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0OiBhc3luYyAodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QnLCAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwR2V0JywgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0OiBhc3luYyAodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwTGlzdCcsICd0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNyZWF0ZTogYXN5bmMgKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckNyZWF0ZScsICd1c2VyQ3JlYXRlUmVxdWVzdCcsIHVzZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGU6IGFzeW5jICh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJVcGRhdGUnLCAndXNlclVwZGF0ZVJlcXVlc3QnLCB1c2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlOiBhc3luYyAod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRDcmVhdGUnLCAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcsIHdhbGxldENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldEdldDogYXN5bmMgKHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0R2V0JywgJ3dhbGxldEdldFJlcXVlc3QnLCB3YWxsZXRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0OiBhc3luYyAod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRMaXN0JywgJ3dhbGxldExpc3RSZXF1ZXN0Jywgd2FsbGV0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGU6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZScsICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25HZXQnLCAnd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25MaXN0JywgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnLCB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXN0b3J5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2hpdC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQ6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldDogYXN5bmMgKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCcsICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcsIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB0aGUgY3VzdG9tZXIgdG8gcmV0cmlldmUgYSBCYXNlIFJlcG9ydC4gQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Jhc2VSZXBvcnRHZXRSZXF1ZXN0fSBiYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3Q6IEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhc2VSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0uICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdH0gYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGAgcmV0dXJucyBwYXJzZWQgZGF0YSBmcm9tIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB1c2VycyBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gSWYgeW91ciBhY2NvdW50IGlzIG5vdCBlbmFibGVkIGZvciBEb2N1bWVudCBQYXJzaW5nLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudCAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlbiAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZGFzaGJvYXJkIHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgaWRlbnRpdHkgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGlkZW50aXR5IHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgaWRlbnRpdHkgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnRzLCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gXFxcIk5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gYXMgYSBwcm9jZXNzb3IgdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gb3VyIGVycm9yIGRvY3VtZW50YXRpb24gb24gW2l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS4gVG8gcmVkdWNlIHRoaXMgbGF0ZW5jeSwgeW91IGNhbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIG9uIHRoZSBJdGVtIGJlZm9yZSB5b3UgbmVlZCB0byByZXF1ZXN0IFNpZ25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIEJhbmsgYWNjb3VudCB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmVwbGFjZXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGl0cyBhc3NvY2lhdGVkIHdlYmhvb2tzIGZvciBtb3N0IGNvbW1vbiB1c2UtY2FzZXMuICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiBhbmQgZ2V0IHVwZGF0ZXMgc3luY2hyb25vdXNseSBpbiBhIHN0cmVhbS1saWtlIG1hbm5lciwgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHRoZSBlbmRwb2ludCB3aWxsIHJldHVybiBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9jZXNzb3IgdG9rZW4gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgcHJvY2Vzc29yIHRva2VuLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aXRoIHRoZSBuZXcgY3Vyc29yLCBwdWxsaW5nIGFsbCB1cGRhdGVzLCB1bnRpbCBgaGFzX21vcmVgIGlzIGBmYWxzZWAuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUsIHdoaWNoIGNhbiBvY2N1ciBhcyBhIHJlc3VsdCBvZiB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBmb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzb3IgdG9rZW5zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBUcmFuc2FjdGlvbnMgdXBkYXRlIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEFjY291bnQgU2VsZWN0IHYyLiAgYEFVVEhfREFUQV9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQXV0aCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWA6IFJlY3VycmluZyBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiAgSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgUFJPRFVDVF9SRUFEWWA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYSBnaXZlbiBhc3NldCByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgRVJST1JgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGFzc2V0IHJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQgKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2Fubm90IGJlIHVzZWQgd2l0aCBPQXV0aCBpbnN0aXR1dGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gTGluayBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiAgSWYgeW91IGFyZSB1c2luZyBvdGhlciBQbGFpZCBwcm9kdWN0cyBhZnRlciBMaW5rLCBlLmcuIElkZW50aXR5IG9yIEFzc2V0cywgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBhZnRlciB0aG9zZSBwcm9kdWN0IGNhbGxzIGFyZSBjb21wbGV0ZS4gIEV4YW1wbGUgZmxvdzogTGluayBpcyBpbml0aWFsaXplZCB3aXRoIEF1dGgsIGNhbGwgYC9hdXRoL2dldGAgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciwgY2FsbCBgL2lkZW50aXR5L2dldGAgdG8gcmV0cmlldmUgYmFuayBvd25lcnNoaXAgZGV0YWlscywgdGhlbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIGJlZ2luIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24uIExhdGVyLCBvbmNlIHlvdSBoYXZlIG9idGFpbmVkIGRldGFpbHMgYWJvdXQgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHVzZXIsIGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgIGZvciBhIFNpZ25hbCBzY29yZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBbUmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayB3aXRoIHNwZWNpZmljIHByb2R1Y3QgY29tYmluYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jcmVjb21tZW5kYXRpb25zLWZvci1pbml0aWFsaXppbmctbGluay13aXRoLXNwZWNpZmljLXByb2R1Y3QtY29tYmluYXRpb25zKS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxQcmVwYXJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFN0YXRlbWVudHNMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuIEZvciBvcHRpbWFsIHJlc3VsdHMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCBjdXN0b21lcnMgdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgaXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMgKHVzaW5nIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgb3B0aW9uKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgdG8gcmVtb3ZlIGEgdHJhbnNhY3Rpb24gcnVsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVG8gbGVhcm4gbW9yZSBhYm91dCBtaWdyYXRpbmcgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYW4gSXRlbSwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEl0ZW0gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgSXRlbS4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBGb3IgbmV3bHkgY3JlYXRlZCBJdGVtcywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgZG9lcyBub3QgZGlyZWN0bHkgcmV0dXJuIGJhbGFuY2UgZGF0YS4gVG8gZ2V0IHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LCBjYWxsIGAvYWNjb3VudHMvZ2V0YCwgd2hpY2ggaXMgYSBmcmVlLXRvLXVzZSBlbmRwb2ludCB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgYmFsYW5jZSBhcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXIuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFByb2Nlc3Npbmcgb2YgdGhlIHJlZnVuZCB3aWxsIG5vdCBvY2N1ciB1bnRpbCBhdCBsZWFzdCA0IGJ1c2luZXNzIGRheXMgZm9sbG93aW5nIHRoZSB0cmFuc2ZlclxcJ3Mgc2V0dGxlbWVudCBkYXRlLCBwbHVzIGFueSBob2xkL3NldHRsZW1lbnQgZGVsYXlzLiBUaGlzIDMtZGF5IHdpbmRvdyBoZWxwcyBiZXR0ZXIgcHJvdGVjdCB5b3VyIGJ1c2luZXNzIGZyb20gcmVndWxhciBBQ0ggcmV0dXJucy4gQ29uc3VtZXIgaW5pdGlhdGVkIHJldHVybnMgKHVuYXV0aG9yaXplZCByZXR1cm5zKSBjb3VsZCBzdGlsbCBoYXBwZW4gZm9yIGFib3V0IDYwIGRheXMgZnJvbSB0aGUgc2V0dGxlbWVudCBkYXRlLiBJZiB0aGUgb3JpZ2luYWwgdHJhbnNmZXIgaXMgY2FuY2VsZWQsIHJldHVybmVkIG9yIGZhaWxlZCwgYWxsIHBlbmRpbmcgcmVmdW5kcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2FuY2VsZWQuIFByb2Nlc3NlZCByZWZ1bmRzIGNhbm5vdCBiZSByZXZva2VkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBQbGFpZEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBjdXN0b21lciB0byByZXRyaWV2ZSBhIEJhc2UgUmVwb3J0LiBDdXN0b21lcnMgc2hvdWxkIHBhc3MgaW4gdGhlIGB1c2VyX3Rva2VuYCBjcmVhdGVkIGluIGAvbGluay90b2tlbi9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmFzZVJlcG9ydEdldFJlcXVlc3R9IGJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFzZVJlcG9ydEdldChiYXNlUmVwb3J0R2V0UmVxdWVzdDogQmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFzZVJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbS4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIHBhcnRpY2lwYXRpbmcgR292ZXJubWVudCBTcG9uc29yZWQgRW50aXR5IChHU0UpLiBJZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgdG9rZW4gZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZi4gQW4gQXVkaXQgQ29weSB0b2tlbiBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCAocmVzdWx0IG9mIC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0KS4gIFVzZSB0aGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSBHU0Ugd2hvIG5lZWRzIGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnQgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRhc2hib2FyZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZGFzaGJvYXJkIHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2VuZXJpYyB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBGRFggRXZlbnQgTm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlSZWZyZXNoUmVxdWVzdH0gaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBpZGVudGl0eSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGlkZW50aXR5IHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBpZGVudGl0eSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvbuKAmXMgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnTigJlzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBwYXJhbWV0ZXJzIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBoYXMgc2luY2UgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0OiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdDogSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbi4gT24gYW4gdW5saW5rIHJlcXVlc3QsIFBsYWlkIHdpbGwgaW1tZWRpYXRlbHkgcmV2b2tlIHRoZSBBcHBsaWNhdGlvbuKAmXMgYWNjZXNzIHRvIHRoZSBVc2Vy4oCZcyBkYXRhLiAgVGhlIFVzZXIgd2lsbCBoYXZlIHRvIHJlZG8gdGhlIE9BdXRoIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gcmVzdG9yZSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBlbmRwb2ludCBvbmx5IHJlbW92ZXMgb25nb2luZyBkYXRhIGFjY2VzcyBwZXJtaXNzaW9ucywgdGhlcmVmb3JlIHRoZSBVc2VyIHdpbGwgbmVlZCB0byByZWFjaCBvdXQgdG8gdGhlIEFwcGxpY2F0aW9uIGl0c2VsZiBpbiBvcmRlciB0byBkaXNhYmxlIGFuZCBkZWxldGUgdGhlaXIgYWNjb3VudCBhbmQgZGVsZXRlIGFueSBkYXRhIHRoYXQgdGhlIEFwcGxpY2F0aW9uIGFscmVhZHkgcmVjZWl2ZWQgKGlmIHRoZSBBcHBsaWNhdGlvbiBkb2VzIG5vdCBkbyBzbyBieSBkZWZhdWx0KS4gIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBpbiByZWFsIHRpbWUgYXMgdGhlIFVzZXIgaXMgdW5saW5raW5nIGFuIEFwcGxpY2F0aW9uLCBhbmQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2UgaXMgcmVmbGVjdGVkIGFzIHNvb24gYXMgcG9zc2libGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtSW1wb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIGRhdGEgYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiBGb3IgZGV0YWlscyBvbiBhbnkgcGF5bWVudCBsaW1pdHMgaW4gUHJvZHVjdGlvbiwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzIG9uIHRoZSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIEJ5IGRlZmF1bHQsIGEgcHJvY2Vzc29yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpdGVtLiBUbyByZXN0cmljdCBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggdGhlIGRlc2lyZWQgcHJvZHVjdHMuIFRvIHJlc3RvcmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIGFuIGVtcHR5IGxpc3QuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB5b3VyIG5lZWRzIGFuZCB5b3VyIHByb2Nlc3NvclxcJ3MgbmVlZHMgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJlcGxhY2VzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpdHMgYXNzb2NpYXRlZCB3ZWJob29rcyBmb3IgbW9zdCBjb21tb24gdXNlLWNhc2VzLiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byBzdWJzY3JpYmUgdG8gYWxsIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgdHJhY2tpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcHJvY2Vzc29yIHRva2VuIHVwIHVudGlsIHRoZSB0aW1lIG9mIHRoZSBBUEkgY2FsbCAoYXMgXFxcImFkZHNcXFwiKSwgd2hpY2ggdGhlbiBnZW5lcmF0ZXMgYSBgbmV4dF9jdXJzb3JgIGZvciB0aGF0IHByb2Nlc3NvciB0b2tlbi4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBUaGUgYGhhc19tb3JlYCBmaWVsZCBzcGVjaWZpZXMgaWYgYWRkaXRpb25hbCBjYWxscyBhcmUgbmVjZXNzYXJ5IHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb24gdXBkYXRlcy4gQ2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlLCB3aGljaCBjYW4gb2NjdXIgYXMgYSByZXN1bHQgb2YgdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHByb3ZpZGUgdGhlc2UgdXBkYXRlcy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZm9yIG5ld2x5IGNyZWF0ZWQgcHJvY2Vzc29yIHRva2VucywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIFBsYWlkIGJlZ2lucyBwcmVwYXJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBUcmFuc2FjdGlvbnMgdXBkYXRlIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEFjY291bnQgU2VsZWN0IHYyLiAgYEFVVEhfREFUQV9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQXV0aCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWA6IFJlY3VycmluZyBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiAgSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgUFJPRFVDVF9SRUFEWWA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYSBnaXZlbiBhc3NldCByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgRVJST1JgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGFzc2V0IHJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQgKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2Fubm90IGJlIHVzZWQgd2l0aCBPQXV0aCBpbnN0aXR1dGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gTGluayBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiAgSWYgeW91IGFyZSB1c2luZyBvdGhlciBQbGFpZCBwcm9kdWN0cyBhZnRlciBMaW5rLCBlLmcuIElkZW50aXR5IG9yIEFzc2V0cywgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBhZnRlciB0aG9zZSBwcm9kdWN0IGNhbGxzIGFyZSBjb21wbGV0ZS4gIEV4YW1wbGUgZmxvdzogTGluayBpcyBpbml0aWFsaXplZCB3aXRoIEF1dGgsIGNhbGwgYC9hdXRoL2dldGAgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciwgY2FsbCBgL2lkZW50aXR5L2dldGAgdG8gcmV0cmlldmUgYmFuayBvd25lcnNoaXAgZGV0YWlscywgdGhlbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIGJlZ2luIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24uIExhdGVyLCBvbmNlIHlvdSBoYXZlIG9idGFpbmVkIGRldGFpbHMgYWJvdXQgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHVzZXIsIGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgIGZvciBhIFNpZ25hbCBzY29yZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBbUmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayB3aXRoIHNwZWNpZmljIHByb2R1Y3QgY29tYmluYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jcmVjb21tZW5kYXRpb25zLWZvci1pbml0aWFsaXppbmctbGluay13aXRoLXNwZWNpZmljLXByb2R1Y3QtY29tYmluYXRpb25zKS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYW4gSXRlbSB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxQcmVwYXJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFN0YXRlbWVudHNMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiBGb3Igb3B0aW1hbCByZXN1bHRzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgY3VzdG9tZXJzIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIGl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zICh1c2luZyB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIG9wdGlvbikuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHN1YnNjcmliZSB0byBhbGwgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB0cmFja2luZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gVG8gbGVhcm4gbW9yZSBhYm91dCBtaWdyYXRpbmcgZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmb3IgYW4gSXRlbSwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEl0ZW0gdXAgdW50aWwgdGhlIHRpbWUgb2YgdGhlIEFQSSBjYWxsIChhcyBcXFwiYWRkc1xcXCIpLCB3aGljaCB0aGVuIGdlbmVyYXRlcyBhIGBuZXh0X2N1cnNvcmAgZm9yIHRoYXQgSXRlbS4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIFRoZSBgaGFzX21vcmVgIGZpZWxkIHNwZWNpZmllcyBpZiBhZGRpdGlvbmFsIGNhbGxzIGFyZSBuZWNlc3NhcnkgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiB1cGRhdGVzLiBDYWxsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcHJvdmlkZSB0aGVzZSB1cGRhdGVzLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBGb3IgbmV3bHkgY3JlYXRlZCBJdGVtcywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gUGxhaWQgYmVnaW5zIHByZXBhcmluZyB0cmFuc2FjdGlvbnMgZGF0YSB3aGVuIHRoZSBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgZG9lcyBub3QgZGlyZWN0bHkgcmV0dXJuIGJhbGFuY2UgZGF0YS4gVG8gZ2V0IHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LCBjYWxsIGAvYWNjb3VudHMvZ2V0YCwgd2hpY2ggaXMgYSBmcmVlLXRvLXVzZSBlbmRwb2ludCB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjYWNoZWQgYmFsYW5jZSBhcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6IElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYElURU1fTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgaW5jb21lIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgaW5jb21lIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUGxhaWRBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgUGxhaWRBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgYXV0aGAgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmFzZVJlcG9ydEdldFJlcXVlc3R9IGJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFzZVJlcG9ydEdldChiYXNlUmVwb3J0R2V0UmVxdWVzdDogQmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBCZWFjb24gVXNlci4gIFRoZSBCZWFjb24gVXNlciBpcyByZXR1cm5lZCB3aXRoIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBhIGBzdGF0dXNgIGJhc2VkIG9uIHRoZSBCZWFjb24gTmV0d29yayBkdXBsaWNhdGUgcmVjb3JkIGFuZCBmcmF1ZCBjaGVja3MuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0uICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgZnJhdWRfcmlza2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGRhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBpZGVudGl0eSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGlkZW50aXR5IHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBpZGVudGl0eSB2ZXJpZmljYXRpb25cbiAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudHMsIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBcXFwiTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBQcm9kdWN0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIElkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gYXMgYSBwcm9jZXNzb3IgdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gb3VyIGVycm9yIGRvY3VtZW50YXRpb24gb24gW2l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS4gVG8gcmVkdWNlIHRoaXMgbGF0ZW5jeSwgeW91IGNhbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIG9uIHRoZSBJdGVtIGJlZm9yZSB5b3UgbmVlZCB0byByZXF1ZXN0IFNpZ25hbCBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIEJhbmsgYWNjb3VudCB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBJZiB0aGUgYWNjb3VudCBtdXN0IGJlIGxpbmtlZCB0byBhIG5ldyBvciBkaWZmZXJlbnQgcGFydG5lciByZXNvdXJjZSwgY3JlYXRlIGEgbmV3IEl0ZW0gYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggdGhlIExpbmsgZmxvdyBhZ2FpbjsgYSBuZXcgcHJvY2Vzc29yIHRva2VuIGNhbiB0aGVuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiBQcm9jZXNzb3IgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzIG9uIHRoZSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIEJ5IGRlZmF1bHQsIGEgcHJvY2Vzc29yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpdGVtLiBUbyByZXN0cmljdCBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggdGhlIGRlc2lyZWQgcHJvZHVjdHMuIFRvIHJlc3RvcmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIGFuIGVtcHR5IGxpc3QuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB5b3VyIG5lZWRzIGFuZCB5b3VyIHByb2Nlc3NvclxcJ3MgbmVlZHMgY2hhbmdlLlxuICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJlcGxhY2VzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpdHMgYXNzb2NpYXRlZCB3ZWJob29rcyBmb3IgbW9zdCBjb21tb24gdXNlLWNhc2VzLiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byBzdWJzY3JpYmUgdG8gYWxsIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgdHJhY2tpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFJldHVybmVkIHRyYW5zYWN0aW9ucyBkYXRhIGlzIGdyb3VwZWQgaW50byB0aHJlZSB0eXBlcyBvZiB1cGRhdGUsIGluZGljYXRpbmcgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFkZGVkLCByZW1vdmVkLCBvciBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBBUEkuICBJbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcHJvY2Vzc29yIHRva2VuIHVwIHVudGlsIHRoZSB0aW1lIG9mIHRoZSBBUEkgY2FsbCAoYXMgXFxcImFkZHNcXFwiKSwgd2hpY2ggdGhlbiBnZW5lcmF0ZXMgYSBgbmV4dF9jdXJzb3JgIGZvciB0aGF0IHByb2Nlc3NvciB0b2tlbi4gSW4gc3Vic2VxdWVudCBjYWxscywgc2VuZCB0aGUgYG5leHRfY3Vyc29yYCB0byByZWNlaXZlIG9ubHkgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBUaGUgYGhhc19tb3JlYCBmaWVsZCBzcGVjaWZpZXMgaWYgYWRkaXRpb25hbCBjYWxscyBhcmUgbmVjZXNzYXJ5IHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb24gdXBkYXRlcy4gQ2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlLCB3aGljaCBjYW4gb2NjdXIgYXMgYSByZXN1bHQgb2YgdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIFdoZW5ldmVyIG5ldyBvciB1cGRhdGVkIHRyYW5zYWN0aW9uIGRhdGEgYmVjb21lcyBhdmFpbGFibGUsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHByb3ZpZGUgdGhlc2UgdXBkYXRlcy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZm9yIG5ld2x5IGNyZWF0ZWQgcHJvY2Vzc29yIHRva2VucywgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIFBsYWlkIGJlZ2lucyBwcmVwYXJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBJdGVtIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgcHJvY2VzcyBjYW4gdGFrZSBhbnl3aGVyZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBiYW5rIGluY29tZSB3ZWJob29rIGluIHNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBUcmFuc2FjdGlvbnMgdXBkYXRlIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEFjY291bnQgU2VsZWN0IHYyLiAgYEFVVEhfREFUQV9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQXV0aCBhcyBhbiBlbmFibGVkIHByb2R1Y3QuICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWA6IFJlY3VycmluZyBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiAgSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgUFJPRFVDVF9SRUFEWWA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYSBnaXZlbiBhc3NldCByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgRVJST1JgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGFzc2V0IHJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQgKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gRm9yIG9wdGltYWwgcmVzdWx0cywgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIGN1c3RvbWVycyB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBpdGVtcyB3aXRoIFRyYW5zYWN0aW9ucyAodXNpbmcgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBvcHRpb24pLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byBzdWJzY3JpYmUgdG8gYWxsIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgZ2V0IHVwZGF0ZXMgc3luY2hyb25vdXNseSBpbiBhIHN0cmVhbS1saWtlIG1hbm5lciwgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvdHJhbnNhY3Rpb25zL2dldGAgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgdHJhY2tpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuIFRvIGxlYXJuIG1vcmUgYWJvdXQgbWlncmF0aW5nIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZm9yIGFuIEl0ZW0sIHRoZSBlbmRwb2ludCB3aWxsIHJldHVybiBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhhdCBJdGVtIHVwIHVudGlsIHRoZSB0aW1lIG9mIHRoZSBBUEkgY2FsbCAoYXMgXFxcImFkZHNcXFwiKSwgd2hpY2ggdGhlbiBnZW5lcmF0ZXMgYSBgbmV4dF9jdXJzb3JgIGZvciB0aGF0IEl0ZW0uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBUaGUgYGhhc19tb3JlYCBmaWVsZCBzcGVjaWZpZXMgaWYgYWRkaXRpb25hbCBjYWxscyBhcmUgbmVjZXNzYXJ5IHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb24gdXBkYXRlcy4gQ2FsbCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aXRoIHRoZSBuZXcgY3Vyc29yLCBwdWxsaW5nIGFsbCB1cGRhdGVzLCB1bnRpbCBgaGFzX21vcmVgIGlzIGBmYWxzZWAuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHByb3ZpZGUgdGhlc2UgdXBkYXRlcy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgRm9yIG5ld2x5IGNyZWF0ZWQgSXRlbXMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AuIFBsYWlkIGJlZ2lucyBwcmVwYXJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgd2hlbiB0aGUgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgZGF0YSBpcyBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGRvZXMgbm90IGRpcmVjdGx5IHJldHVybiBiYWxhbmNlIGRhdGEuIFRvIGdldCB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudCwgY2FsbCBgL2FjY291bnRzL2dldGAsIHdoaWNoIGlzIGEgZnJlZS10by11c2UgZW5kcG9pbnQgdGhhdCB3aWxsIHJldHVybiB0aGUgY2FjaGVkIGJhbGFuY2UgYXMgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCB0cmFuc2FjdGlvbnMgdXBkYXRlLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudEdldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAqIEBzdW1tYXJ5IERlcG9zaXQgZnVuZHMgaW50byBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci4gIFNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIGJhbmsgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFByb2Nlc3Npbmcgb2YgdGhlIHJlZnVuZCB3aWxsIG5vdCBvY2N1ciB1bnRpbCBhdCBsZWFzdCA0IGJ1c2luZXNzIGRheXMgZm9sbG93aW5nIHRoZSB0cmFuc2ZlclxcJ3Mgc2V0dGxlbWVudCBkYXRlLCBwbHVzIGFueSBob2xkL3NldHRsZW1lbnQgZGVsYXlzLiBUaGlzIDMtZGF5IHdpbmRvdyBoZWxwcyBiZXR0ZXIgcHJvdGVjdCB5b3VyIGJ1c2luZXNzIGZyb20gcmVndWxhciBBQ0ggcmV0dXJucy4gQ29uc3VtZXIgaW5pdGlhdGVkIHJldHVybnMgKHVuYXV0aG9yaXplZCByZXR1cm5zKSBjb3VsZCBzdGlsbCBoYXBwZW4gZm9yIGFib3V0IDYwIGRheXMgZnJvbSB0aGUgc2V0dGxlbWVudCBkYXRlLiBJZiB0aGUgb3JpZ2luYWwgdHJhbnNmZXIgaXMgY2FuY2VsZWQsIHJldHVybmVkIG9yIGZhaWxlZCwgYWxsIHBlbmRpbmcgcmVmdW5kcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2FuY2VsZWQuIFByb2Nlc3NlZCByZWZ1bmRzIGNhbm5vdCBiZSByZXZva2VkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgaW5jb21lIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgaW5jb21lIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0OiBVc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdDogV2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHN1bW1hcnkgTGlzdCBlLXdhbGxldCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFdhdGNobGlzdCBTY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBXYXRjaGxpc3QgUHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG59XG5cblxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQUU1Rjs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2hCLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7QUFDZixDQUFDLEVBTFcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUFLbkI7QUFxQ0Q7OztNQUdNO0FBQ04sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3RCLDZEQUEyQyxDQUFBO0lBQzNDLHNDQUFvQixDQUFBO0lBQ3BCLDhDQUE0QixDQUFBO0lBQzVCLHFDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUt6QjtBQStIRDs7O01BR007QUFDTixJQUFZLG1DQVFYO0FBUkQsV0FBWSxtQ0FBbUM7SUFDM0MsdUZBQWdELENBQUE7SUFDaEQsc0dBQStELENBQUE7SUFDL0QsZ0dBQXlELENBQUE7SUFDekQsNkVBQXNDLENBQUE7SUFDdEMsbUZBQTRDLENBQUE7SUFDNUMsaUZBQTBDLENBQUE7SUFDMUMsMkVBQW9DLENBQUE7QUFDeEMsQ0FBQyxFQVJXLG1DQUFtQyxHQUFuQywyQ0FBbUMsS0FBbkMsMkNBQW1DLFFBUTlDO0FBNkpEOzs7TUFHTTtBQUNOLElBQVksaUNBUVg7QUFSRCxXQUFZLGlDQUFpQztJQUN6QyxxRkFBZ0QsQ0FBQTtJQUNoRCxvR0FBK0QsQ0FBQTtJQUMvRCw4RkFBeUQsQ0FBQTtJQUN6RCwyRUFBc0MsQ0FBQTtJQUN0Qyxp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QyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2TCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQXA4RkQsNEJBbzhGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4NS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlLmcuIGJpbGwgcGF5bWVudCAgYFxcXCJ0ZWxcXFwiYCAtIFRlbGVwaG9uZS1Jbml0aWF0ZWQgRW50cnkgIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkgLSBkZWJpdHMgZnJvbSBhIGNvbnN1bWVy4oCZcyBhY2NvdW50IHdoZXJlIHRoZWlyIGF1dGhvcml6YXRpb24gaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBUZWwgPSAndGVsJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBBUFIgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFQUlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW5udWFsIFBlcmNlbnRhZ2UgUmF0ZSBhcHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBhcHJfcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGJhbGFuY2UgdG8gd2hpY2ggdGhlIEFQUiBhcHBsaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl90eXBlOiBBUFJBcHJUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbW9uZXkgdGhhdCBpcyBzdWJqZWN0ZWQgdG8gdGhlIEFQUiBpZiBhIGJhbGFuY2Ugd2FzIGNhcnJpZWQgYmV5b25kIHBheW1lbnQgZHVlIGRhdGUuIEhvdyBpdCBpcyBjYWxjdWxhdGVkIGNhbiB2YXJ5IGJ5IGNhcmQgaXNzdWVyLiBJdCBpcyBvZnRlbiBjYWxjdWxhdGVkIGFzIGFuIGF2ZXJhZ2UgZGFpbHkgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBiYWxhbmNlX3N1YmplY3RfdG9fYXByOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSBjaGFyZ2VkIGR1ZSB0byBpbnRlcmVzdCBmcm9tIGxhc3Qgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGludGVyZXN0X2NoYXJnZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQVBSQXByVHlwZUVudW0ge1xuICAgIEJhbGFuY2VUcmFuc2ZlckFwciA9ICdiYWxhbmNlX3RyYW5zZmVyX2FwcicsXG4gICAgQ2FzaEFwciA9ICdjYXNoX2FwcicsXG4gICAgUHVyY2hhc2VBcHIgPSAncHVyY2hhc2VfYXByJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnXG59XG5cbi8qKlxuICogQWxsb3cgb3IgZGlzYWxsb3cgcHJvZHVjdCBhY2Nlc3MgYnkgYWNjb3VudC4gVW5saXN0ZWQgKGUuZy4gbWlzc2luZykgYWNjb3VudHMgd2lsbCBiZSBjb25zaWRlcmVkIGBuZXdfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QWNjZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMgIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBDaGFzZSBJdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0SW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEFzc2V0UmVwb3J0SW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5Gb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZT86IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBc3NldHNBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEFycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEFzc2V0UmVwb3J0SW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5Gb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM/OiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlPzogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM/OiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LiBCYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSBiYWxhbmNlIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbHRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBBdXRvbWF0ZWQgb3IgTWFudWFsIG1pY3JvLWRlcG9zaXRzLiAgUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBOb3RlOiBEYXRhYmFzZSBNYXRjaCBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRCYXNlVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBDaGFzZSBJdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGVzIHRoZSBhY2NvdW50IHN1YnR5cGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpc2hlcyBmb3IgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byBzZWxlY3QgZnJvbS4gRm9yIG1vcmUgZGV0YWlscyByZWZlciB0byBQbGFpZCBkb2N1bWVudGF0aW9uIG9uIGFjY291bnQgZmlsdGVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgYGFjY291bnRfZmlsdGVyc2Agc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IERlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIElkZW50aXR5IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnRzIHRoYXQgaWRlbnRpdHkgZGF0YSBpcyBkZXJ2aWVkIGZyb20uIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiBub25lIG9mIHRoZSBhY2NvdW50IGlkZW50aXR5IGlzIGZyb20gYSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnQ+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnRzIHRoYXQgaWRlbnRpdHkgZGF0YSBpcyBkZXJ2aWVkIGZyb20uIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBpZiBub25lIG9mIHRoZSBhY2NvdW50IGlkZW50aXR5IGlzIGZyb20gYSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudD47XG59XG4vKipcbiAqIElkZW50aXR5IG1hdGNoIHNjb3JlcyBmb3IgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gTm90ZTogRGF0YWJhc2UgTWF0Y2ggaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05hbWVNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBFbWFpbEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmFtZU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVBbGxPZlxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1haWxBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IEVtYWlsQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBhY2NvdW50IGRhdGEuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyB0YXggZG9jdW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0YXhfZG9jdW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IGFjY291bnRzIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBjYXJkaW5hbGl0eS4gYE1VTFRJX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgbXVsdGlwbGUgYWNjb3VudHMuIGBTSU5HTEVfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBvbmx5IGEgc2luZ2xlIGFjY291bnQuIGBBTExgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBtdXN0IHNoYXJlIGFsbCBvZiB0aGVpciBhY2NvdW50cyBhbmQgc2hvdWxkIG5vdCBiZSBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkgdG8gZGUtc2VsZWN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U2VsZWN0aW9uQ2FyZGluYWxpdHkge1xuICAgIFNpbmdsZVNlbGVjdCA9ICdTSU5HTEVfU0VMRUNUJyxcbiAgICBNdWx0aVNlbGVjdCA9ICdNVUxUSV9TRUxFQ1QnLFxuICAgIEFsbCA9ICdBTEwnXG59XG5cbi8qKlxuICogU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFN1YnR5cGUge1xuICAgIF80MDFhID0gJzQwMWEnLFxuICAgIF80MDFrID0gJzQwMWsnLFxuICAgIF80MDNCID0gJzQwM0InLFxuICAgIF80NTdiID0gJzQ1N2InLFxuICAgIF81MjkgPSAnNTI5JyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpcmEgPSAnbGlyYScsXG4gICAgTHJpZiA9ICdscmlmJyxcbiAgICBMcnNwID0gJ2xyc3AnLFxuICAgIE5vbkN1c3RvZGlhbFdhbGxldCA9ICdub24tY3VzdG9kaWFsIHdhbGxldCcsXG4gICAgTm9uVGF4YWJsZUJyb2tlcmFnZUFjY291bnQgPSAnbm9uLXRheGFibGUgYnJva2VyYWdlIGFjY291bnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgTW9uZXlNYXJrZXQgPSAnbW9uZXkgbWFya2V0JyxcbiAgICBQcmVwYWlkID0gJ3ByZXBhaWQnLFxuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBSZWN1cnJpbmcgPSAncmVjdXJyaW5nJyxcbiAgICBSZXdhcmRzID0gJ3Jld2FyZHMnLFxuICAgIFNhZmVEZXBvc2l0ID0gJ3NhZmUgZGVwb3NpdCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIHR5cGUgaXMgY2FsbGVkIGBicm9rZXJhZ2VgIGluc3RlYWQuICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFR5cGUge1xuICAgIEludmVzdG1lbnQgPSAnaW52ZXN0bWVudCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9kZXRhaWxzPzogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGZvciBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgcGF5bWVudCBkZXRhaWxzLiBJZiBzZXQsIGEgcGF5bWVudCByaXNrIGFzc2Vzc21lbnQgaXMgcGVyZm9ybWVkIGFuZCByZXR1cm5lZCBhcyBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGhyZXNob2xkIHBlcmNlbnRhZ2Ugb2YgdGhlIGFjY291bnQgYmFsYW5jZSB1c2VkIGZvciBjb21wYXJpc29uIHdpdGggdGhlIHJlcXVlc3RlZCBBQ0ggZGViaXQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2U/OiBudW1iZXI7XG59XG4vKipcbiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGRldGFpbGVkIHJpc2sgYXNzZXNzbWVudCBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGZpdmUtdGllciByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgcmV0dXJuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgcmlza19sZXZlbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdGVkIEFDSCBkZWJpdCBhbW91bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgKHNldCBieSBjdXN0b21lcnMpIG9mIHRoZSBhdmFpbGFibGUgb3IgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIGV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YCBhbmQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3YXMgY2FsbGVkLCBlYWNoIGFjY291bnQgd2lsbCBpbmNsdWRlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnR9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Jpc2tfYXNzZXNzbWVudD86IEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhY3Rpb24vYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpb25TdGF0ZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBBdHRlbXB0ID0gJ0FUVEVNUFQnLFxuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgICBTa2lwcGVkID0gJ1NLSVBQRUQnXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgY29uc2VudCBhY3Rpdml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWN0aXZpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWN0aXZpdHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGFjdGl2aXR5OiBBY3Rpdml0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhY3Rpdml0eSB3YXMgaW5pdGlhdGVkIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdGVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWN0aXZpdHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXBwbGljYXRpb24gSUQgb2YgdGhlIGNsaWVudCB3aG8gaW5pdGlhdGVkIHRoZSBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIGluaXRpYXRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpb25TdGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzdGF0ZTogQWN0aW9uU3RhdGU7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHRhcmdldF9hcHBsaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUeXBlcyBvZiBjb25zZW50IGFjdGl2aXRpZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjdGl2aXR5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBJdGVtQ3JlYXRlID0gJ0lURU1fQ1JFQVRFJyxcbiAgICBJdGVtSW1wb3J0ID0gJ0lURU1fSU1QT1JUJyxcbiAgICBJdGVtVXBkYXRlID0gJ0lURU1fVVBEQVRFJyxcbiAgICBJdGVtVW5saW5rID0gJ0lURU1fVU5MSU5LJyxcbiAgICBQb3J0YWxVbmxpbmsgPSAnUE9SVEFMX1VOTElOSycsXG4gICAgUG9ydGFsSXRlbXNEZWxldGUgPSAnUE9SVEFMX0lURU1TX0RFTEVURScsXG4gICAgSXRlbVJlbW92ZSA9ICdJVEVNX1JFTU9WRScsXG4gICAgSW52YXJpYW50Q2hlY2tlckRlbGV0aW9uID0gJ0lOVkFSSUFOVF9DSEVDS0VSX0RFTEVUSU9OJyxcbiAgICBTY29wZXNVcGRhdGUgPSAnU0NPUEVTX1VQREFURSdcbn1cblxuLyoqXG4gKiBBIHBoeXNpY2FsIG1haWxpbmcgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc1xuICAgICAqL1xuICAgIGRhdGE6IEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGFkZHJlc3Mgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc1xuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBpcyBiZWluZyB1c2VkIGZvciBjb21tZXJjaWFsIG9yIHJlc2lkZW50aWFsIHB1cnBvc2VzLiAgTm90ZTogVGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYCB3aGVuIFBsYWlkIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGRldGVybWluZSB0aGUgYWRkcmVzc1xcJ3MgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc1B1cnBvc2VMYWJlbCB7XG4gICAgUmVzaWRlbnRpYWwgPSAncmVzaWRlbnRpYWwnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFwcGxpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYXBwbGljYXRpb24gd2FzIGdyYW50ZWQgcHJvZHVjdGlvbiBhY2Nlc3MgYXQgUGxhaWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBqb2luX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIGNsaWVudOKAmXMgYnJvYWQgdXNlIGNhc2UgYXMgYXNzZXNzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VfY2FzZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgY2xpZW504oCZcyBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb21wYW55X2xlZ2FsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjaXR5IG9mIHRoZSBjbGllbnTigJlzIGhlYWRxdWFydGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZWdpb24gb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zdGFsIGNvZGUgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGNvZGUgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBcHBsaWNhdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgc2NoZW1hIGZvciBgL2FwcGxpY2F0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXREZXRhaWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRIb2xkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRPd25lciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRPd25lcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdG9yX2lkYCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRvcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIFRoZSBgYXNzZXRzYCBwcm9kdWN0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIGxpbms7IHRoZSBBc3NldHMgcHJvZHVjdCBjYW5ub3QgYmUgYWRkZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuIElmIHVzaW5nIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR5LCBgZGF5c19yZXF1ZXN0ZWRgIG11c3QgYmUgYXQgbGVhc3QgNjEgZm9yIG5ldyBvcmlnaW5hdGlvbnMgb3IgYXQgbGVhc3QgMzEgZm9yIHJlZmluYW5jaW5ncy4gIEFuIEFzc2V0IFJlcG9ydCByZXF1ZXN0ZWQgd2l0aCBcXFwiQWRkaXRpb25hbCBIaXN0b3J5XFxcIiAodGhhdCBpcywgd2l0aCBtb3JlIHRoYW4gNjEgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSB3aWxsIGluY3VyIGFuIEFkZGl0aW9uYWwgSGlzdG9yeSBmZWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLiBUaGUgb3B0aW9uYWwgYHVzZXJgIG9iamVjdCBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR5IHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIHRydWUgdG8gcmV0dXJuIGJhbGFuY2UgYW5kIGlkZW50aXR5IGVhcmxpZXIgYXMgYSBmYXN0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9mYXN0X3JlcG9ydD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGFzc2V0IHJlcG9ydC4gUG9zc2libGUgdmFsdWVzOiBgXFxcImludmVzdG1lbnRzXFxcImBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIHJlcXVlc3QgYSBgZmFzdF9hc3NldGAgcmVwb3J0LiBXaGVuIEZhc3QgQXNzZXRzIGlzIHJlcXVlc3RlZCwgUGxhaWQgd2lsbCBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IGZpcnN0LCB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IGN1cnJlbnQgaWRlbnRpdHkgYW5kIGJhbGFuY2UgaW5mb3JtYXRpb24sIGFuZCBsYXRlciwgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBoaXN0b3JpY2FsIGJhbGFuY2UgaW5mb3JtYXRpb24gYW5kIHRyYW5zYWN0aW9uIGRhdGEuIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWRkX29ucz86IEFycmF5PEFzc2V0UmVwb3J0QWRkT25zPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdXNlcj86IEFzc2V0UmVwb3J0VXNlcjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGZvciB3aGljaCB0byBjcmVhdGUgYW4gYXNzZXQgcmVwb3J0IGZvci4gVGhlIGxhdGVzdCBhc3NldCByZXBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGZldGNoIFxcXCJmYXN0XFxcIiB2ZXJzaW9uIG9mIGFzc2V0IHJlcG9ydC4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC4gQ2FuIG9ubHkgYmUgdXNlZCBpZiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdhcyBjYWxsZWQgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGZhc3RfcmVwb3J0PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgb3IgYWRkIGRhdGEgdG8gYC9hc3NldF9yZXBvcnQvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c190b19pbmNsdWRlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQXNzZXRSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBpZGVudGl0eSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0dXJuZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpZGVudGl0eSBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5nXFwncyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIGhvbGRpbmdzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGhvbGRpbmcsIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdG90YWwgdmFsdWUgb2YgdGhlIGhvbGRpbmcuIFRoaXMgZmllbGQgaXMgY2FsY3VsYXRlZCBieSBQbGFpZCBhcyB0aGUgc3VtIG9mIHRoZSBwdXJjaGFzZSBwcmljZSBvZiBhbGwgb2YgdGhlIHNoYXJlcyBpbiB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgY29zdF9iYXNpczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBzZWN1cml0eSBpcyBhbiBvcHRpb24sIGBxdWFudGl0eWAgd2lsbCByZWZsZWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3B0aW9ucyAodHlwaWNhbGx5IHRoZSBudW1iZXIgb2YgY29udHJhY3RzIG11bHRpcGxpZWQgYnkgMTAwKSwgbm90IHRoZSBudW1iZXIgb2YgY29udHJhY3RzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW52ZXN0bWVudCBzZWN1cml0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiBWYWxpZCBzZWN1cml0eSB0eXBlcyBhcmU6ICBgY2FzaGA6IENhc2gsIGN1cnJlbmN5LCBhbmQgbW9uZXkgbWFya2V0IGZ1bmRzICBgY3J5cHRvY3VycmVuY3lgOiBEaWdpdGFsIG9yIHZpcnR1YWwgY3VycmVuY2llcyAgYGRlcml2YXRpdmVgOiBPcHRpb25zLCB3YXJyYW50cywgYW5kIG90aGVyIGRlcml2YXRpdmUgaW5zdHJ1bWVudHMgIGBlcXVpdHlgOiBEb21lc3RpYyBhbmQgZm9yZWlnbiBlcXVpdGllcyAgYGV0ZmA6IE11bHRpLWFzc2V0IGV4Y2hhbmdlLXRyYWRlZCBpbnZlc3RtZW50IGZ1bmRzICBgZml4ZWQgaW5jb21lYDogQm9uZHMgYW5kIGNlcnRpZmljYXRlcyBvZiBkZXBvc2l0IChDRHMpICBgbG9hbmA6IExvYW5zIGFuZCBsb2FuIHJlY2VpdmFibGVzICBgbXV0dWFsIGZ1bmRgOiBPcGVuLSBhbmQgY2xvc2VkLWVuZCB2ZWhpY2xlcyBwb29saW5nIGZ1bmRzIG9mIG11bHRpcGxlIGludmVzdG9ycyAgYG90aGVyYDogVW5rbm93biBvciBvdGhlciBpbnZlc3RtZW50IHR5cGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHdpdGhpbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBwb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbuKAmXMgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGFuIEFzc2V0IFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QXNzZXRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRBc3NldHM+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfdG9faW5jbHVkZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gTXVzdCBiZSBhbiBpbnRlZ2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgY2Fubm90IGJlIGBudWxsYC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBc3NldCBSZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiBvbiB0aGUgYXNzZXQgcmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWRpdF9jYXRlZ29yeT86IENyZWRpdENhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIFRoZSB1c2VyIG9iamVjdCBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB0byBiZSBhcHBlbmRlZCB0byB0aGUgQXNzZXQgUmVwb3J0LiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbC4gVGhlIGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGFuZCBgc3NuYCBmaWVsZHMgYXJlIHJlcXVpcmVkIGlmIHlvdSB3b3VsZCBsaWtlIHRoZSBSZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWXigJlzIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgeW91IGRldGVybWluZSBhbmQgc3VibWl0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZS4gIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gQ2F0ZWdvcnkgVHlwZSBFbnVtZXJhdGVkIGRlcml2ZWQgYnkgVmVuZG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB7XG4gICAgQXRtRmVlID0gJ0FUTUZlZScsXG4gICAgQWR2ZXJ0aXNpbmcgPSAnQWR2ZXJ0aXNpbmcnLFxuICAgIEFpclRyYXZlbCA9ICdBaXJUcmF2ZWwnLFxuICAgIEFsY29ob2xCYXJzID0gJ0FsY29ob2xCYXJzJyxcbiAgICBBbGxvd2FuY2UgPSAnQWxsb3dhbmNlJyxcbiAgICBBbXVzZW1lbnQgPSAnQW11c2VtZW50JyxcbiAgICBBcnRzID0gJ0FydHMnLFxuICAgIEF1dG9UcmFuc3BvcnQgPSAnQXV0b1RyYW5zcG9ydCcsXG4gICAgQXV0b0luc3VyYW5jZSA9ICdBdXRvSW5zdXJhbmNlJyxcbiAgICBBdXRvUGF5bWVudCA9ICdBdXRvUGF5bWVudCcsXG4gICAgQmFieVN1cHBsaWVzID0gJ0JhYnlTdXBwbGllcycsXG4gICAgQmFieXNpdHRlckRheWNhcmUgPSAnQmFieXNpdHRlckRheWNhcmUnLFxuICAgIEJhbmtGZWUgPSAnQmFua0ZlZScsXG4gICAgQmlsbHNVdGlsaXRpZXMgPSAnQmlsbHNVdGlsaXRpZXMnLFxuICAgIEJvbnVzID0gJ0JvbnVzJyxcbiAgICBCb29rc1N1cHBsaWVzID0gJ0Jvb2tzU3VwcGxpZXMnLFxuICAgIEJ1c2luZXNzU2VydmljZXMgPSAnQnVzaW5lc3MgU2VydmljZXMnLFxuICAgIEJ1eSA9ICdCdXknLFxuICAgIENhc2hBdG0gPSAnQ2FzaEFUTScsXG4gICAgQ2hhcml0eSA9ICdDaGFyaXR5JyxcbiAgICBDaGVjayA9ICdDaGVjaycsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NoaWxkU3VwcG9ydCcsXG4gICAgQ2xvdGhpbmcgPSAnQ2xvdGhpbmcnLFxuICAgIENvZmZlZVNob3BzID0gJ0NvZmZlZVNob3BzJyxcbiAgICBDcmVkaXRDYXJkUGF5bWVudCA9ICdDcmVkaXRDYXJkUGF5bWVudCcsXG4gICAgRGVudGlzdCA9ICdEZW50aXN0JyxcbiAgICBEb2N0b3IgPSAnRG9jdG9yJyxcbiAgICBFZHVjYXRpb24gPSAnRWR1Y2F0aW9uJyxcbiAgICBFbGVjdHJvbmljc1NvZnR3YXJlID0gJ0VsZWN0cm9uaWNzU29mdHdhcmUnLFxuICAgIEVudGVydGFpbm1lbnQgPSAnRW50ZXJ0YWlubWVudCcsXG4gICAgRXllY2FyZSA9ICdFeWVjYXJlJyxcbiAgICBGYXN0Rm9vZCA9ICdGYXN0Rm9vZCcsXG4gICAgRmVkZXJhbFRheCA9ICdGZWRlcmFsVGF4JyxcbiAgICBGZWVzQ2hhcmdlcyA9ICdGZWVzQ2hhcmdlcycsXG4gICAgRmluYW5jZUNoYXJnZSA9ICdGaW5hbmNlQ2hhcmdlJyxcbiAgICBGaW5hbmNpYWwgPSAnRmluYW5jaWFsJyxcbiAgICBGaW5hbmNpYWxBZHZpc29yID0gJ0ZpbmFuY2lhbEFkdmlzb3InLFxuICAgIEZvb2REaW5pbmcgPSAnRm9vZERpbmluZycsXG4gICAgRnVybmlzaGluZ3MgPSAnRnVybmlzaGluZ3MnLFxuICAgIEdhc0Z1ZWwgPSAnR2FzRnVlbCcsXG4gICAgR2lmdHNEb25hdGlvbnMgPSAnR2lmdHNEb25hdGlvbnMnLFxuICAgIEdyb2NlcmllcyA9ICdHcm9jZXJpZXMnLFxuICAgIEd5bSA9ICdHeW0nLFxuICAgIEhhaXIgPSAnSGFpcicsXG4gICAgSGVhbHRoRml0bmVzcyA9ICdIZWFsdGhGaXRuZXNzJyxcbiAgICBIZWFsdGhJbnN1cmFuY2UgPSAnSGVhbHRoSW5zdXJhbmNlJyxcbiAgICBIb2JiaWVzID0gJ0hvYmJpZXMnLFxuICAgIEhvbWUgPSAnSG9tZScsXG4gICAgSG9tZUltcHJvdmVtZW50ID0gJ0hvbWVJbXByb3ZlbWVudCcsXG4gICAgSG9tZUluc3VyYW5jZSA9ICdIb21lSW5zdXJhbmNlJyxcbiAgICBIb21lUGhvbmUgPSAnSG9tZVBob25lJyxcbiAgICBIb21lU2VydmljZXMgPSAnSG9tZVNlcnZpY2VzJyxcbiAgICBIb21lU3VwcGxpZXMgPSAnSG9tZVN1cHBsaWVzJyxcbiAgICBIb3RlbCA9ICdIb3RlbCcsXG4gICAgSW5jb21lID0gJ0luY29tZScsXG4gICAgSW50ZXJlc3RJbmNvbWUgPSAnSW50ZXJlc3RJbmNvbWUnLFxuICAgIEludGVybmV0ID0gJ0ludGVybmV0JyxcbiAgICBJbnZlc3RtZW50cyA9ICdJbnZlc3RtZW50cycsXG4gICAgS2lkcyA9ICdLaWRzJyxcbiAgICBLaWRzQWN0aXZpdGllcyA9ICdLaWRzQWN0aXZpdGllcycsXG4gICAgTGF0ZUZlZSA9ICdMYXRlRmVlJyxcbiAgICBMYXVuZHJ5ID0gJ0xhdW5kcnknLFxuICAgIExhd25HYXJkZW4gPSAnTGF3bkdhcmRlbicsXG4gICAgTGVnYWwgPSAnTGVnYWwnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnTGlmZUluc3VyYW5jZScsXG4gICAgTG9hbkluc3VyYW5jZSA9ICdMb2FuSW5zdXJhbmNlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdMb2FuUGF5bWVudCcsXG4gICAgTG9hbnMgPSAnTG9hbnMnLFxuICAgIE1vYmlsZVBob25lID0gJ01vYmlsZVBob25lJyxcbiAgICBNb3J0Z2FnZVJlbnQgPSAnTW9ydGdhZ2VSZW50JyxcbiAgICBNb3ZpZXNEdmRzID0gJ01vdmllc0RWRHMnLFxuICAgIE11c2ljID0gJ011c2ljJyxcbiAgICBOZXdzcGFwZXJzTWFnYXppbmVzID0gJ05ld3NwYXBlcnNNYWdhemluZXMnLFxuICAgIE9mZmljZVN1cHBsaWVzID0gJ09mZmljZVN1cHBsaWVzJyxcbiAgICBQYXJraW5nID0gJ1BhcmtpbmcnLFxuICAgIFBheWNoZWNrID0gJ1BheWNoZWNrJyxcbiAgICBQZXJzb25hbENhcmUgPSAnUGVyc29uYWxDYXJlJyxcbiAgICBQZXRGb29kU3VwcGxpZXMgPSAnUGV0Rm9vZFN1cHBsaWVzJyxcbiAgICBQZXRHcm9vbWluZyA9ICdQZXRHcm9vbWluZycsXG4gICAgUGV0cyA9ICdQZXRzJyxcbiAgICBQaGFybWFjeSA9ICdQaGFybWFjeScsXG4gICAgUHJpbnRpbmcgPSAnUHJpbnRpbmcnLFxuICAgIFByb3BlcnR5VGF4ID0gJ1Byb3BlcnR5IFRheCcsXG4gICAgUHVibGljVHJhbnNwb3J0YXRpb24gPSAnUHVibGljIFRyYW5zcG9ydGF0aW9uJyxcbiAgICBSZWltYnVyc2VtZW50ID0gJ1JlaW1idXJzZW1lbnQnLFxuICAgIFJlbnRhbENhclRheGkgPSAnUmVudGFsQ2FyVGF4aScsXG4gICAgUmVzdGF1cmFudHMgPSAnUmVzdGF1cmFudHMnLFxuICAgIFNhbGVzVGF4ID0gJ1NhbGVzVGF4JyxcbiAgICBTZXJ2aWNlUGFydHMgPSAnU2VydmljZVBhcnRzJyxcbiAgICBTZXJ2aWNlRmVlID0gJ1NlcnZpY2VGZWUnLFxuICAgIFNoaXBwaW5nID0gJ1NoaXBwaW5nJyxcbiAgICBTaG9wcGluZyA9ICdTaG9wcGluZycsXG4gICAgU3BhTWFzc2FnZSA9ICdTcGFNYXNzYWdlJyxcbiAgICBTcG9ydGluZ0dvb2RzID0gJ1Nwb3J0aW5nR29vZHMnLFxuICAgIFNwb3J0cyA9ICdTcG9ydHMnLFxuICAgIFN0YXRlVGF4ID0gJ1N0YXRlVGF4JyxcbiAgICBTdHVkZW50TG9hbiA9ICdTdHVkZW50IExvYW4nLFxuICAgIFRheGVzID0gJ1RheGVzJyxcbiAgICBUZWxldmlzaW9uID0gJ1RlbGV2aXNpb24nLFxuICAgIFRveXMgPSAnVG95cycsXG4gICAgVHJhbnNmZXIgPSAnVHJhbnNmZXInLFxuICAgIFRyYXZlbCA9ICdUcmF2ZWwnLFxuICAgIFR1aXRpb24gPSAnVHVpdGlvbicsXG4gICAgVW5jYXRlZ29yaXplZCA9ICdVbmNhdGVnb3JpemVkJyxcbiAgICBVdGlsaXRpZXMgPSAnVXRpbGl0aWVzJyxcbiAgICBWYWNhdGlvbiA9ICdWYWNhdGlvbicsXG4gICAgVmV0ZXJpbmFyeSA9ICdWZXRlcmluYXJ5J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEZXNjcmlwdGlvbiBTdHJpbmcgdXAgdG8gMyBvY2N1cmFuY2VzIDEgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdmVuZG9yIGNyZWF0ZWQgdW5pcXVlIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25VbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gQW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBQb3N0IERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25Qb3N0RGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlOiBBc3NldFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB3aXRoIHdobyBkaWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUGFpZEJ5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGSSBQcm92aWRlZCAtIGV4YW1wbGVzIGFyZSBhdG0sIGNhc2gsIGNoZWNrLCBjcmVkaXQsIGRlYml0LCBkZXBvc2l0LCBkaXJlY3REZWJpdCwgZGlyZWN0RGVwb3NpdCwgZGl2aWRlbmQsIGZlZSwgaW50ZXJlc3QsIG90aGVyLCBwYXltZW50LCBwb2ludE9mU2FsZSwgcmVwZWF0UGF5bWVudCwgc2VydmljZUNoYXJnZSwgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZTogQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgcHJvdmlkZWQgVHJhbnNhY3Rpb24gSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2FjdGlvbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIFR5cGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQ3JlZGl0ID0gJ0NyZWRpdCcsXG4gICAgRGViaXQgPSAnRGViaXQnXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgZmluYW5jaWFsIGFzc2V0cyBpbiBhIG1vcnRnYWdlIGxvYW4gdHJhbnNhY3Rpb24uIEFzc2V0cyBtYXkgYmUgZWl0aGVyIGxpcXVpZCBvciBmaXhlZCBhbmQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgYXNzZXQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUeXBlIHtcbiAgICBDaGVja2luZ0FjY291bnQgPSAnQ2hlY2tpbmdBY2NvdW50JyxcbiAgICBTYXZpbmdzQWNjb3VudCA9ICdTYXZpbmdzQWNjb3VudCcsXG4gICAgSW52ZXN0bWVudCA9ICdJbnZlc3RtZW50JyxcbiAgICBNb25leU1hcmtldEZ1bmQgPSAnTW9uZXlNYXJrZXRGdW5kJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldD59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxBc3NldD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzRXJyb3JXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBBc3NldCBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW914oCZbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgQXNzZXQgUmVwb3J0IHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXBvcnQgdHlwZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBBc3NldCBSZXBvcnQgaXMgYSBgZnVsbGAgb3IgYGZhc3RgIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0TnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCQUNTIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEF1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRzYCBmb3Igd2hpY2ggbnVtYmVycyBhcmUgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBdXRoIGZlYXR1cmVzIG9mIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoU3VwcG9ydGVkTWV0aG9kc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aE1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydGVkX21ldGhvZHM6IEF1dGhTdXBwb3J0ZWRNZXRob2RzIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gd2hpY2ggYXV0aCBtZXRob2RzIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBhdXRoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWF0Y2ggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF1dG9tYXRlZCBtaWNyb2RlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IG1pY3JvZGVwb3NpdHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgdmVyaWZpZWQgdmlhIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0cy4gV2UgcmVjb21tZW5kIGNvbW11bmljYXRpbmcgdG8geW91ciB1c2VycyB3aGVuIHRoaXMgZXZlbnQgaXMgcmVjZWl2ZWQgdG8gbm90aWZ5IHRoZW0gdGhhdCB0aGVpciBhY2NvdW50IGlzIHZlcmlmaWVkIGFuZCByZWFkeSBmb3IgdXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgaW4gQ1JBIGVuYWJsZWQgY2xpZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVmcmVzaCByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIHJlZnJlc2hlZCByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlZnJlc2hlZCBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC4gVG8gZ2V0IHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIHZpYSB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgaXMgZGV0ZWN0ZWQuIFlvdSBzaG91bGQgY2FsbCBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCB0byBnZXQgdXBkYXRlZCBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuIFRvIHJlY2VpdmUgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgaW4gdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwgXFxcIlIwOFxcXCIsICBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLiBUaGVzZSByZXR1cm5zIGhhdmUgYSB0dXJuYXJvdW5kIHRpbWUgb2YgMiBiYW5raW5nIGRheXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgYGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBlaWdodCByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wJSAtIDAuNSUgICAyOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC41JSAtIDEuNSUgICAzOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMS41JSAtIDMlICAgNDogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDMlIC0gNSUgICA1OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gNSUgLSAxMCUgICA2OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTAlIC0gMTUlICAgNzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDE1JSBhbmQgNTAlICAgODogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gNTAlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIGEgYmFuayB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlIC0gdGhlIHN1bSBvZiBhbGwgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2ZlciBhbW91bnRzIG1pbnVzIGFsbCBjcmVkaXQgdHJhbnNmZXIgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHJhbnNhY3RhYmxlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IEJhbmtUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYCBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMsIG9yIGBpbmJvdW5kYCBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBCYW5rVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU/OiBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgYmFuayB0cmFuc2ZlciByZXByZXNlbnRzLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgY2FuY2VsbGVkYDogVGhlIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHBvc3RlZGA6IFRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmV2ZXJzZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSB0eXBlIG9mIHRoaXMgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldmVyc2VkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXZlcnNlZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW0JhbmsgVHJhbnNmZXJzIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYmFuay10cmFuc2ZlcnMvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYmFuayB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSBvcmlnaW5hdGVkIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyczogQXJyYXk8QmFua1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIFRoaXMgaXMgdGhlIEFCQSBudW1iZXI7IGZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIEFDSCBudW1iZXIgdXNlZCBpbiBgcm91dGluZ19udW1iZXJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudCAoYGNoZWNraW5nYCBvciBgc2F2aW5nc2ApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCwgYHNhbWUtZGF5LWFjaGAsIG9yIGB3aXJlYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBXaXJlID0gJ3dpcmUnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXAgZGVzY3JpYmVzIGEgc3dlZXAgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogQmFua1RyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHRoYXQgdGhlIHN3ZWVwcyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGZ1bGwgbGVnYWwgbmFtZS4gSWYgdGhlIHRyYW5zZmVyIGBhY2hfY2xhc3NgIGlzIGBjY2RgLCB0aGlzIHNob3VsZCBiZSB0aGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGVtYWlsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpbiByZXNwb25zZSBkYXRhLiBEbyBub3QgcHJvdmlkZSB0aGlzIGZpZWxkIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgYmFuayB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IEFDSCBldmVudHMgYXJlIGF2YWlsYWJsZS4gVG8gYmVnaW4gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IG11c3QgZmlyc3QgcmVnaXN0ZXIgeW91ciB3ZWJob29rIGxpc3RlbmVyIGVuZHBvaW50IHZpYSB0aGUgW3dlYmhvb2tzIHBhZ2UgaW4gdGhlIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vd2ViaG9va3MpLiBUaGUgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgY2FuIGJlIHVzZWQgdG8gdHJhY2sgdGhlIHByb2dyZXNzIG9mIEFDSCB0cmFuc2ZlcnMgdXNlZCBpbiBbbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb25dKC9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLiBOb3RlIHRoYXQgW1RyYW5zZmVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSBjdXN0b21lcnMgc2hvdWxkIHVzZSBUcmFuc2ZlciB3ZWJob29rcyBpbnN0ZWFkIG9mIHVzaW5nIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYDsgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50cyBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tGb3JBdXRoIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQmFzZSBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBCYXNlIFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IFBsYWlkIGFib3V0IGVhY2ggb2YgdGhlIEl0ZW1zIGluY2x1ZGVkIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEJhc2VSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlcztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzLiBUcmFuc2FjdGlvbiBoaXN0b3J5IHJldHVybmVkIGJ5IGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSB0b3AtbGV2ZWwgYHRyYW5zYWN0aW9uc2AgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PEJhc2VSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPd25lcnNoaXBUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlOiBPd25lcnNoaXBUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzIGFuZCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBieSBgYnJva2VyYWdlYCBvciBgaW52ZXN0bWVudGAgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEhpc3RvcmljYWxCYWxhbmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRBY2NvdW50SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pbnNpZ2h0cz86IEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHM7XG59XG4vKipcbiAqIEJhc2UgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB0aGUgdG90YWwgY2FzaCBhdmFpbGFibGUgdG8gd2l0aGRyYXcgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGBhdmFpbGFibGVgICBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlLCBQbGFpZCB3aWxsIHJldHVybiBhbiBgYXZhaWxhYmxlYCBiYWxhbmNlIHZhbHVlIG9mIGBudWxsYC4gIEF2YWlsYWJsZSBiYWxhbmNlIG1heSBiZSBjYWNoZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVwLXRvLWRhdGUgaW4gcmVhbHRpbWUgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiBgY3VycmVudGAgaXMgYG51bGxgIHRoaXMgZmllbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGFuZCBleHBlY3RlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBhbmQgdGhlIEl0ZW0gY29udGFpbnMgb25lIG9yIG1vcmUgYWNjb3VudHMgd2l0aCBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgdHlwZSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIENhcGl0YWwgT25lIGRlcG9zaXRvcnkgYWNjb3VudHMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgYWNjb3VudCB0eXBlcyBvbiBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIFNlZSBbYWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvciBhIGZ1bGwgbGlzdCBvZiBhY2NvdW50IHR5cGVzLiAgSWYgdGhlIGJhbGFuY2UgdGhhdCBpcyBwdWxsZWQgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wIGZvciBJdGVtcyB3aXRoIHRoaXMgZmllbGQgcmVxdWlyZWQsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZm9yIHRoZSBlbnRpcmUgcmVwb3J0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIG9mIGVhY2ggY2FsZW5kYXIgbW9udGhcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZlcmFnZV9tb250aGx5X2JhbGFuY2VzPzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBmcm9tIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RoaXJ0eV9kYXlfYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZm9yIHRoZSBlbnRpcmUgcmVwb3J0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc0FsbE9mXG4gICAgICovXG4gICAgYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2Ugb2YgZWFjaCBjYWxlbmRhciBtb250aFxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlcz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNBbGxPZlxuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RoaXJ0eV9kYXlfYXZlcmFnZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlZCBpbnNpZ2h0cyBkZXJpdmVkIGZyb20gdHJhbnNhY3Rpb24tbGV2ZWwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBiYXNlIHJlcG9ydCBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBiYXNlIHJlcG9ydCBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1vc3RfcmVjZW50X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgZGF5cyBhdmFpbGFibGUgaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMb25nZXN0IGdhcCBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbG9uZ2VzdF9nYXBfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlYml0cyBpbnRvIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2luZmxvd3M/OiBBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9pbmZsb3dfYW1vdW50PzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNyZWRpdCBpbnRvIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX291dGZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2ZXJhZ2UgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBhdmVyYWdlX291dGZsb3dfYW1vdW50PzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyB3aXRoIG5vIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfZGF5c19ub190cmFuc2FjdGlvbnM/OiBudW1iZXI7XG59XG4vKipcbiAqIEF2ZXJhZ2UgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgb3IgZGViaXQgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYWRkZWQgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEF2ZXJhZ2UgYmFsYW5jZSBpbiBkb2xsYXIgYW1vdW50IHBlciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfYmFsYW5jZT86IENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeTtcbn1cbi8qKlxuICogQmFzZVJlcG9ydEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBCYXNlUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBidXQgaWRlbnRpdHkgaW5mb3JtYXRpb24gY2Fubm90IGJlIHJldHVybmVkLCB0aGlzIGFycmF5IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JzIGNhdXNpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24gdG8gYmUgbWlzc2luZ1xuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYSBCYXNlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmFzZVJlcG9ydEFjY291bnQ+O1xufVxuLyoqXG4gKiBMYXJnZXN0IG51bWJlciBvZiBkYXlzIGJldHdlZW4gc2VxdWVudGlhbCB0cmFuc2FjdGlvbnMgcGVyIGNhbGVuZGFyIG1vbnRoXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGlzIHRpbWUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIGNyZWRpdHMgb3IgZGViaXRzIG91dCBvZiB0aGUgYWNjb3VudC4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYWRkZWQgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNyZWRpdHMgb3IgZGViaXRzIG91dCBvZiB0aGUgYWNjb3VudCBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25cXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWRpdF9jYXRlZ29yeT86IENyZWRpdENhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGFuIEJhc2UgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQmFzZSBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0V2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydFdhcm5pbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFTRV9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0V2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBCYXNlUmVwb3J0V2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgT1dORVJTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggQ3JlZGl0IGFuZCBEZXBvc2l0b3J5IGFjY291bnRzIGFyZSB1bmF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRXYXJuaW5nQ29kZSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBCYXNlIFJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIFRoZSByZXN1bHRpbmcgYGVycm9yYCB3aWxsIGhhdmUgYW4gYGVycm9yX3R5cGVgIG9mIGBCQVNFX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCQVNFX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEJhc2UgUmVwb3J0IGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgYC9jcmEvYmFzZV9yZXBvcnQvZ2V0YCBpcyByZWFkeSB0byBiZSBjYWxsZWQuICBJZiB5b3UgYXR0ZW1wdCB0byByZXRyaWV2ZSBhIEJhc2UgUmVwb3J0IGJlZm9yZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB5b3XigJlsbCByZWNlaXZlIGEgcmVzcG9uc2Ugd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA0MDAgYW5kIGEgUGxhaWQgZXJyb3IgY29kZSBvZiBgUFJPRFVDVF9OT1RfUkVBRFlgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCQVNFX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgc291cmNlOiBCZWFjb25BdWRpdFRyYWlsU291cmNlO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHR5cGUgaW5kaWNhdGluZyB3aGF0IGNhdXNlZCBhIHJlc291cmNlIHRvIGJlIGNoYW5nZWQgb3IgdXBkYXRlZC4gICBgZGFzaGJvYXJkYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGJ5IGEgbWVtYmVyIG9mIHlvdXIgdGVhbSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC4gIGBhcGlgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgdmlhIHRoZSBQbGFpZCBBUEkuICBgc3lzdGVtYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBwYXJ0IG9mIHRoZSBQbGFpZCBCZWFjb24gc3lzdGVtLiBGb3IgZXhhbXBsZSwgaWYgYW5vdGhlciBidXNpbmVzcyB1c2luZyBQbGFpZCBCZWFjb24gY3JlYXRlZCBhIGZyYXVkIHJlcG9ydCB0aGF0IG1hdGNoZWQgb25lIG9mIHlvdXIgdXNlcnMsIHlvdXIgbWF0Y2hpbmcgdXNlclxcJ3Mgc3RhdHVzIHdvdWxkIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCBhbmQgdGhlIGF1ZGl0IHRyYWlsIHNvdXJjZSB3b3VsZCBiZSBgc3lzdGVtYC4gIGBidWxrX2ltcG9ydGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhcyBwYXJ0IG9mIGEgYnVsayBpbXBvcnQgcHJvY2Vzcy4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgY29tcGFueSBwcm92aWRlZCBhIENTViBvZiB1c2VyIGRhdGEgYXMgcGFydCBvZiB5b3VyIGluaXRpYWwgb25ib2FyZGluZywgdGhlIGF1ZGl0IHRyYWlsIHNvdXJjZSB3b3VsZCBiZSBgYnVsa19pbXBvcnRgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uQXVkaXRUcmFpbFNvdXJjZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgQXBpID0gJ2FwaScsXG4gICAgU3lzdGVtID0gJ3N5c3RlbScsXG4gICAgQnVsa0ltcG9ydCA9ICdidWxrX2ltcG9ydCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQmVhY29uIFVzZXIgY3JlYXRlZCB3aXRoaW4geW91ciBvcmdhbml6YXRpb24gbWF0Y2hlcyBvbmUgb2YgeW91ciBleGlzdGluZyB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBEVVBMSUNBVEVfREVURUNURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX2R1cGxpY2F0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZURldGVjdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gRHVwbGljYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBtYXRjaGluZyBCZWFjb24gVXNlcnMgYW5kIGFuIGFuYWx5c2lzIG9mIHRoZSBmaWVsZHMgdGhleSBtYXRjaGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMTogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIyOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gb25lIEJlYWNvbiBVc2VyIGFuZCBhbm90aGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gdHdvIEJlYWNvbiBVc2Vycy4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlci4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIHRoZSBvdGhlciBCZWFjb24gVXNlci4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG9yaWdpbmFsIEJlYWNvbiBVc2VyIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBub3QgcHJlc2VudCBpbiBvbmUgb2YgdGhlIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbk1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudD86IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgZnJhdWQgY29tbWl0dGVkIGJ5IGEgdXNlciBhcyB3ZWxsIGFzIHRoZSBkYXRlIHRoZSBmcmF1ZCB3YXMgY29tbWl0dGVkIGFuZCB0aGUgdG90YWwgYW1vdW50IG9mIG1vbmV5IGxvc3QgZHVlIHRvIHRoZSBmcmF1ZCBpbmNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBibG9jayBzaW1pbGFyIGZyYXVkIGF0dGVtcHRzIG9uIHlvdXIgcGxhdGZvcm0gYXMgd2VsbCBhcyBhbGVydCBvdGhlciBjb21wYW5pZXMgd2hvIHNjcmVlbiBhIHVzZXIgd2l0aCBtYXRjaGluZyBpZGVudGl0eSBpbmZvcm1hdGlvbi4gT3RoZXIgY29tcGFuaWVzIHdpbGwgbm90IHJlY2VpdmUgYW55IG5ldyBpZGVudGl0eSBpbmZvcm1hdGlvbiwganVzdCB3aGF0IG1hdGNoZWQsIHBsdXMgaW5mb3JtYXRpb24gc3VjaCBhcyBpbmR1c3RyeSwgdHlwZSBvZiBmcmF1ZCwgYW5kIGRhdGUgb2YgZnJhdWQuICBZb3UgY2FuIG1hbmFnZSB5b3VyIGZyYXVkIHJlcG9ydHMgYnkgYWRkaW5nLCBkZWxldGluZywgb3IgZWRpdGluZyByZXBvcnRzIGFzIHlvdSBnZXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBmcmF1ZHVsZW50IHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzIGlzIGZpcnN0IHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfQ1JFQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2Ftb3VudDogRnJhdWRBbW91bnQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBCZWFjb24gUmVwb3J0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9yZXBvcnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydHM6IEFycmF5PEJlYWNvblJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIHJlcG9ydDogQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAgICAgKi9cbiAgICBhbmFseXNpczogQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcztcbn1cbi8qKlxuICogQW5hbHlzaXMgb2Ygd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCB3YXMgc3luZGljYXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZXBvcnQgY3JlYXRlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgbWF0Y2hlcyB3aXRoIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVBPUlRfU1lORElDQVRJT05fQ1JFQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbnM6IEFycmF5PEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gYSBCZWFjb24gUmVwb3J0IHRoYXQgaGFzIGJlZW4gc3luZGljYXRlZCB0byBhIG1hdGNoaW5nIEJlYWNvbiBVc2VyIGluIHlvdXIgcHJvZ3JhbS4gIFRoZSBgaWRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpcyB0aGUgSUQgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydCB0aGF0IHdhcyBzeW5kaWNhdGVkLiBJZiB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uLCB0aGUgZmllbGQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgSUQgb2YgdGhlIHJlcG9ydC4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgd2lsbCBiZSBgbnVsbGAgaW5kaWNhdGluZyB0aGF0IHRoZSBvcmlnaW5hbCByZXBvcnQgd2FzIGNyZWF0ZWQgYnkgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIHR5cGU6IEJlYWNvblJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBmcmF1ZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIEJlYWNvbiBSZXBvcnQuICBgZmlyc3RfcGFydHlgOiBJZiB0aGlzIGlzIHRoZSBzYW1lIGluZGl2aWR1YWwgYXMgdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3RvbGVuYDogSWYgdGhpcyBpcyBhIGRpZmZlcmVudCBpbmRpdmlkdWFsIGZyb20gdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3ludGhldGljYDogSWYgdGhpcyBpcyBhbiBpbmRpdmlkdWFsIHVzaW5nIGZhYnJpY2F0ZWQgaW5mb3JtYXRpb24uICBgYWNjb3VudF90YWtlb3ZlcmA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgYWNjb3VudCB3YXMgY29tcHJvbWlzZWQuICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0VHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIGV4aXN0aW5nIEJlYWNvbiBSZXBvcnRzIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEV2ZW4gaWYgYW4gYWRkcmVzcyBoYXMgYmVlbiBjb2xsZWN0ZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBhIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBVc2VyLiAgVGhlIHByaW1hcnkgdXNlIGZvciB0aGlzIGVuZHBvaW50IGlzIHRvIGFkZCBhIG5ldyBlbmQgdXNlciB0byBCZWFjb24gZm9yIGZyYXVkIGFuZCBkdXBsaWNhdGUgc2Nhbm5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGFsc28gYmUgdXNlZCB0byBpbXBvcnQgaGlzdG9yaWNhbCBmcmF1ZCBjYXNlcyBpbnRvIHRoZSBCZWFjb24gTmV0d29yayB3aXRob3V0IGJlaW5nIGNoYXJnZWQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuIFRvIGltcG9ydCBoaXN0b3JpY2FsIGZyYXVkIGNhc2VzLCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSBvcHRpb25hbCBgcmVwb3J0YCBzZWN0aW9uIG9mIHRoZSByZXF1ZXN0IHBheWxvYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgSUQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJJRE51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGlkZW50aXR5IGRvY3VtZW50IHZhbHVlIHR5cGVkIGluIGJ5IHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgUmV2aXNpb24gaWRlbnRpZmllcyBhIEJlYWNvbiBVc2VyIGF0IHNvbWUgcG9pbnQgaW4gaXRzIHJldmlzaW9uIGhpc3RvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJSZXZpc2lvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlzaW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgcmV2aXNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlzaW9uXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgYHJlamVjdGVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIHJlamVjdGVkIGZvciBmcmF1ZC4gVXNlcnMgY2FuIGJlIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkgcmVqZWN0ZWQuICBgcGVuZGluZ19yZXZpZXdgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gbWFya2VkIGZvciByZXZpZXcuICBgY2xlYXJlZGA6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBjbGVhcmVkIG9mIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uVXNlclN0YXR1cyB7XG4gICAgUmVqZWN0ZWQgPSAncmVqZWN0ZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIENsZWFyZWQgPSAnY2xlYXJlZCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgQmVhY29uIFVzZXIgc3RhdHVzIGhhcyBjaGFuZ2VkLCB3aGljaCBjYW4gb2NjdXIgbWFudWFsbHkgdmlhIHRoZSBkYXNoYm9hcmQgb3Igd2hlbiBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9TVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YTtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZCwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJOYW1lTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBCZWFjb25Vc2VyTmFtZU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogQmVhY29uVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJUHY0IG9yIElQVjYgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciByZXByZXNlbnRzIGFuIGVuZCB1c2VyIHRoYXQgaGFzIGJlZW4gc2Nhbm5lZCBhZ2FpbnN0IHRoZSBCZWFjb24gTmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDYXRlZ29yaWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NhdGVnb3JpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgdHJhbnNhY3Rpb24gY2F0ZWdvcmllcyB1c2VkIGJ5IFBsYWlkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeT59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3JpZXM6IEFycmF5PENhdGVnb3J5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIGEgdHJhbnNhY3Rpb24gY2F0ZWdvcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgY2F0ZWdvcnkuIGBjYXRlZ29yeV9pZGAgaXMgYSBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lcmNoYW50IGNhdGVnb3J5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgcGxhY2VgIGZvciBwaHlzaWNhbCB0cmFuc2FjdGlvbnMgb3IgYHNwZWNpYWxgIGZvciBvdGhlciB0cmFuc2FjdGlvbnMgc3VjaCBhcyBiYW5rIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBncm91cDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgYGNhdGVnb3J5X2lkYCBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGhpZXJhcmNoeTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQ2F0ZWdvcnkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgY29tbW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhdGVnb3J5IHNvcnRlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG9wX2NvdW50ZXJwYXJ0aWVzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5zaWdodHMgb24gYSB1c2VyXFwncyB0b3AgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgcmFua2VkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHRzXG4gICAgICovXG4gICAgcHJpbWFyeV9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5zaWdodHMgb2YgdG9wIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBkZXRhaWxlZF9jYXRlZ29yeV9pbnNpZ2h0cz86IEFycmF5PENhdGVnb3J5SW5zaWdodERldGFpbHM+O1xufVxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F1c2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogUGxhaWRFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QsIHRvIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyBwdXJwb3Nlcy4gVGhpcyBmaWVsZCB3aWxsIGJlIG9taXR0ZWQgaW4gZXJyb3JzIHByb3ZpZGVkIGJ5IHdlYmhvb2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgQXNzZXRzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgb25seSBiZSBwcm92aWRlZCBmb3IgdGhlIGBlcnJvcl90eXBlYCBgQVNTRVRfUkVQT1JUX0VSUk9SYC4gYGNhdXNlc2Agd2lsbCBhbHNvIG5vdCBiZSBwb3B1bGF0ZWQgaW5zaWRlIGFuIGVycm9yIG5lc3RlZCB3aXRoaW4gYSBgd2FybmluZ2Agb2JqZWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGNhdXNlcz86IEFycmF5PGFueT47XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4gVGhpcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgd2hlbiB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIGEgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHN0YXR1cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIFBsYWlkIGRvY3VtZW50YXRpb24gcGFnZSB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHN1Z2dlc3RlZF9hY3Rpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdXNlQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZUFsbE9mXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gdGhhdCBQbGFpZCBoYXMgZW5oYW5jZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgdG8gdGllIHRyYW5zYWN0aW9ucyBiYWNrIHRvIGNsaWVudHNcXCcgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIGFjY291bnRcXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbmhhbmNlbWVudHN9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGVuaGFuY2VtZW50czogRW5oYW5jZW1lbnRzO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiB0aGF0IFBsYWlkIGhhcyBlbnJpY2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gYXMgcHJvdmlkZWQgYnkgeW91IGluIHRoZSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgdXNlciBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB1c2VyLCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X3VzZXJfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X2FjY291bnRfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24gKD49IDApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24gZS5nLiBVU0QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNobWVudHN9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGVucmljaG1lbnRzOiBFbnJpY2htZW50cztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gZm9yIFBsYWlkIHRvIGVuaGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBmb3IgdGhlIHRyYW5zYWN0aW9uIHVzZWQgdG8gaGVscCB5b3UgdGllIGRhdGEgYmFjayB0byB5b3VyIHN5c3RlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRpcmVjdGlvbi4gKE5PVEU6IHRoaXMgd2lsbCBhZmZlY3QgZW5yaWNobWVudCByZXN1bHRzLCBzbyBkaXJlY3Rpb25zIGFyZSBpbXBvcnRhbnQpOi4gICBOZWdhdGl2ZSAoLSkgZm9yIGNyZWRpdHMgKGUuZy4sIGluY29taW5nIHRyYW5zZmVycywgcmVmdW5kcykgICBQb3NpdGl2ZSAoKykgZm9yIGRlYml0cyAoZS5nLiwgcHVyY2hhc2VzLCBmZWVzLCBvdXRnb2luZyB0cmFuc2ZlcnMpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogQSBjbGllbnQtcHJvdmlkZWQgdHJhbnNhY3Rpb24gZm9yIFBsYWlkIHRvIGVucmljaC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHVzZXIsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfdXNlcl9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWNjb3VudCBpZCB1c2VkIHRvIGdyb3VwIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiBhY2NvdW50LCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZyb20geW91ciBhcHBsaWNhdGlvbi4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X2FjY291bnRfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNsaWVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi4gSWYgeW91IGhhdmUgbG9jYXRpb24gZGF0YSBpbiBhdmFpbGFibGUgYW4gdW5zdHJ1Y3R1cmVkIGZvcm1hdCwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24gKD49IDApLiBXaGVuIHRlc3RpbmcgRW5yaWNoLCBub3RlIHRoYXQgYGFtb3VudGAgZGF0YSBzaG91bGQgYmUgcmVhbGlzdGljLiBVbnJlYWxpc3RpYyBvciBpbmFjY3VyYXRlIGBhbW91bnRgIGRhdGEgbWF5IHJlc3VsdCBpbiByZWR1Y2VkIHF1YWxpdHkgb3V0cHV0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMgKE1DQ3MpIGFyZSBmb3VyLWRpZ2l0IG51bWJlcnMgdGhhdCBkZXNjcmliZSBhIG1lcmNoYW50XFwncyBwcmltYXJ5IGJ1c2luZXNzIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1jYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZD86IHN0cmluZztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UuICBVc2UgdGhpcyBmaWVsZCB0byBwYXNzIGluIHN0cnVjdHVyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24geW91IG1heSBoYXZlIGFib3V0IHlvdXIgdHJhbnNhY3Rpb25zLiBQcm92aWRpbmcgbG9jYXRpb24gZGF0YSBpcyBvcHRpb25hbCBidXQgY2FuIGluY3JlYXNlIHJlc3VsdCBxdWFsaXR5LiBJZiB5b3UgaGF2ZSB1bnN0cnVjdHVyZWQgbG9jYXRpb24gaW5mb3JtYXRpb24sIGl0IG1heSBiZSBhcHBlbmRlZCB0byB0aGUgYGRlc2NyaXB0aW9uYCBmaWVsZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29ubmVjdGVkIGFwcGxpY2F0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIHJlYXNvbiBhIGNvbnN1bWVyIHJlcG9ydCBpcyBjcmVhdGVkIGZvciAgYEFDQ09VTlRfUkVWSUVXX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNvbnN1bWVyIGNyZWRpdCB0cmFuc2FjdGlvbiBmb3IgdGhlIHJldmlldyBvciBjb2xsZWN0aW9uIG9mIGFuIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gYEFDQ09VTlRfUkVWSUVXX05PTl9DUkVESVRgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgb2YgdGhlIGluZm9ybWF0aW9uIHRvIHJldmlldyBhIG5vbi1jcmVkaXQgYWNjb3VudCBwcm92aWRlZCBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uc3VtZXIgY29udGludWVzIHRvIG1lZXQgdGhlIHRlcm1zIG9mIHRoZSBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoRikoMikuIGBFTVBMT1lNRU5UYDogRm9yIGVtcGxveW1lbnQgcHVycG9zZXMgcHVyc3VhbnQgdG8gRkNSQSA2MDQoYSkoMykoQiksIGluY2x1ZGluZyBoaXJpbmcsIHJldGVudGlvbiBhbmQgcHJvbW90aW9uIHB1cnBvc2VzLiBgRVhURU5TSU9OX09GX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNyZWRpdCB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgYnkgYW5kIGludm9sdmluZyB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HYDogRm9yIGEgbGVnaXRpbWF0ZSBidXNpbmVzcyBuZWVkIGluIGNvbm5lY3Rpb24gd2l0aCBhIGJ1c2luZXNzIHRyYW5zYWN0aW9uIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHJpbWFyaWx5IGZvciBwZXJzb25hbCwgZmFtaWx5LCBvciBob3VzZWhvbGQgcHVycG9zZXMgaW4gY29ubmVjdGlvbiB3aXRoIGEgcHJvcGVydHkgcmVudGFsIGFzc2Vzc21lbnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gYFdSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHRvIGV2YWx1YXRlIGFuIGFwcGxpY2F0aW9u4oCZcyBwcm9maWxlIHRvIG1ha2UgYW4gb2ZmZXIgdG8gdGhlIGNvbnN1bWVyLiBgV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHN1Y2ggYXMgd2hlbiBhbiBpbmRpdmlkdWFsIGFncmVlcyB0byBhY3QgYXMgYSBndWFyYW50b3Igb3IgYXNzdW1lcyBwZXJzb25hbCBsaWFiaWxpdHkgZm9yIGEgY29uc3VtZXIsIGJ1c2luZXNzLCBvciBjb21tZXJjaWFsIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSB7XG4gICAgQWNjb3VudFJldmlld0NyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19DUkVESVQnLFxuICAgIEFjY291bnRSZXZpZXdOb25DcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfTk9OX0NSRURJVCcsXG4gICAgRW1wbG95bWVudCA9ICdFTVBMT1lNRU5UJyxcbiAgICBFeHRlbnNpb25PZkNyZWRpdCA9ICdFWFRFTlNJT05fT0ZfQ1JFRElUJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkVGVuYW50U2NyZWVuaW5nID0gJ0xFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9URU5BTlRfU0NSRUVOSU5HJyxcbiAgICBMZWdpdGltYXRlQnVzaW5lc3NOZWVkT3RoZXIgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX09USEVSJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25QcmVxdWFsaWZpY2F0aW9uID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fUFJFUVVBTElGSUNBVElPTicsXG4gICAgV3JpdHRlbkluc3RydWN0aW9uT3RoZXIgPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUidcbn1cblxuLyoqXG4gKiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSBkZWZpbmVzIHRoZSB1c2VyIGlkZW50aXR5IGRhdGEgY29sbGVjdGVkIGZvciBjb25zdW1lciByZXBvcnQgcHVycG9zZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB0byBiZSBzZXQgaWYgeW91IGxhdGVyIHVzZSB0aGUgY3JlYXRlZCB1c2VyIGZvciBjb25zdW1lciByZXBvcnQgcHVycG9zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGZpcnN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVycy4gVGhlIGZvcm1hdCBvZiBwaG9uZSBudW1iZXIgd2lsbCBiZSB2YWxpZGF0ZWQgYW5kIGZvciBiZXR0ZXIgbm9ybWFsaXphdGlvbiwgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gRS4xNjQgZm9ybWF0ICt7Y291bnRyeWNvZGV9e251bWJlcn0sIGZvciBleGFtcGxlIGArMTQxNTEyMzQ1NjdgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENvdW50ZXJwYXJ0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnlfY291bnRlcnBhcnR5IGluIEUuIDE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zaWdodHMgYXJvdW5kIGEgdXNlclxcJ3MgY291bnRlcnBhcnRpZXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgcmVsYXRlZCB0byBhIHVzZXLigJlzIHRyYW5zYWN0aW9ucyB3aXRoIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGluY2x1ZGluZyBkZXRlY3RlZCBhY2NvdW50IHR5cGVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5SW5zaWdodHNcbiAgICAgKi9cbiAgICBmaW5hbmNpYWxfaW5zdGl0dXRpb25faW5zaWdodHM/OiBBcnJheTxGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBJbnNpZ2h0cyBhYm91dCBhIHVzZXLigJlzIHRvcCBtZXJjaGFudHMsIHJhbmtlZCBieSBzcGVuZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfaW5zaWdodHM/OiBBcnJheTxNZXJjaGFudEluc2lnaHRzPjtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSB0eXBlLiAgYG1lcmNoYW50YDogYSBwcm92aWRlciBvZiBnb29kcyBvciBzZXJ2aWNlcyBmb3IgcHVyY2hhc2UgYGZpbmFuY2lhbF9pbnN0aXR1dGlvbmA6IGEgZmluYW5jaWFsIGVudGl0eSAoYmFuaywgY3JlZGl0IHVuaW9uLCBCTlBMLCBmaW50ZWNoKSBgcGF5bWVudF9hcHBgOiBhIHRyYW5zZmVyIG9yIFAyUCBhcHAgKGUuZy4gWmVsbGUpIGBtYXJrZXRwbGFjZWA6IGEgbWFya2V0cGxhY2UgKGUuZyBEb29yRGFzaCwgR29vZ2xlIFBsYXkgU3RvcmUpIGBwYXltZW50X3Rlcm1pbmFsYDogYSBwb2ludC1vZi1zYWxlIHBheW1lbnQgdGVybWluYWwgKGUuZyBTcXVhcmUsIFRvYXN0KSBgaW5jb21lX3NvdXJjZWA6IHRoZSBwYXllciBpbiBhbiBpbmNvbWUgdHJhbnNhY3Rpb24gKGUuZy4sIGFuIGVtcGxveWVyLCBjbGllbnQsIG9yIGdvdmVybm1lbnQgYWdlbmN5KVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRlcnBhcnR5VHlwZSB7XG4gICAgTWVyY2hhbnQgPSAnbWVyY2hhbnQnLFxuICAgIEZpbmFuY2lhbEluc3RpdHV0aW9uID0gJ2ZpbmFuY2lhbF9pbnN0aXR1dGlvbicsXG4gICAgUGF5bWVudEFwcCA9ICdwYXltZW50X2FwcCcsXG4gICAgTWFya2V0cGxhY2UgPSAnbWFya2V0cGxhY2UnLFxuICAgIFBheW1lbnRUZXJtaW5hbCA9ICdwYXltZW50X3Rlcm1pbmFsJyxcbiAgICBJbmNvbWVTb3VyY2UgPSAnaW5jb21lX3NvdXJjZSdcbn1cblxuLyoqXG4gKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRyeUNvZGUge1xuICAgIFVzID0gJ1VTJyxcbiAgICBHYiA9ICdHQicsXG4gICAgRXMgPSAnRVMnLFxuICAgIE5sID0gJ05MJyxcbiAgICBGciA9ICdGUicsXG4gICAgSWUgPSAnSUUnLFxuICAgIENhID0gJ0NBJyxcbiAgICBEZSA9ICdERScsXG4gICAgSXQgPSAnSVQnLFxuICAgIFBsID0gJ1BMJyxcbiAgICBEayA9ICdESycsXG4gICAgTm8gPSAnTk8nLFxuICAgIFNlID0gJ1NFJyxcbiAgICBFZSA9ICdFRScsXG4gICAgTHQgPSAnTFQnLFxuICAgIEx2ID0gJ0xWJyxcbiAgICBQdCA9ICdQVCcsXG4gICAgQmUgPSAnQkUnXG59XG5cbi8qKlxuICogVGhlIHJlcG9ydCBvZiB0aGUgQmFuayBJbmNvbWUgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgQmFuayBJbmNvbWUgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIEJhbmsgSW5jb21lIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxDcmFCYW5rSW5jb21lV2FybmluZz47XG59XG4vKipcbiAqIFRoZSBJdGVtXFwncyBiYW5rIGFjY291bnRzIHRoYXQgaGF2ZSB0aGUgc2VsZWN0ZWQgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IGFuZCBhc3NvY2lhdGVkIGBpdGVtX2lkYCB1c2VkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgSXRlbSBhbmQgZXJyb3Igd2hlbiBhIGJhdGNoIG9wZXJhdGlvbiBvcGVyYXRpbmcgb24gbXVsdGlwbGUgSXRlbXMgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIGluIG9uZSBvZiB0aGUgSXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDYXVzZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogQ3JlZGl0QmFua0luY29tZUVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gbnVsbCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZ2VuZXJhdGlvbiAgYFNVQ0NFU1NgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyYS9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgYmFuayBpbmNvbWUgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFbXBsb3llclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBBcnJheTxDcmFCYW5rSW5jb21lPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW5kIHVzZXJcXCdzIG1vbnRobHkgc3VtbWFyeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKSBvZiB0aGUgdXNlciBmb3IgdGhlIG1vbnRoIGluIHRoZSBzdW1tYXJ5LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHBlcmlvZCBjb3ZlcmVkIGluIHRoaXMgbW9udGhseSBzdW1tYXJ5LiBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGJlZ2luIHdpdGggdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgcGVyaW9kIGluY2x1ZGVkIGluIHRoaXMgbW9udGhseSBzdW1tYXJ5LiBUaGlzIGRhdGUgd2lsbCBiZSB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGxhc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBlbmQgd2l0aCB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEFycmF5PENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW1cXCdzIGFjY291bnRzIHRoYXQgaGF2ZSBCYW5rIEluY29tZSBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfYWNjb3VudHM/OiBBcnJheTxDcmFCYW5rSW5jb21lQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIGluY29tZSBzb3VyY2VzIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgc2luZ2xlIGluY29tZSBzb3VyY2UuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3NvdXJjZXM/OiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGVuZCB1c2Vy4oCZcyBuZXh0IHBheWNoZWNrIGZvciB0aGUgaW5jb21lIHNvdXJjZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgYmFuayBpbmNvbWUgYWNyb3NzIGFsbCBpbmNvbWUgc291cmNlcyBhbmQgaXRlbXMgKG1heCBoaXN0b3J5IG9mIDczMCBkYXlzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGVzdGltYXRlIG9mIHRoZSBhdmVyYWdlIGdyb3NzIG1vbnRobHkgaW5jb21lIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIG5ldCBhbW91bnQgYW5kIGluY29tZSBjYXRlZ29yeSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZXN0aW1hdGVkIGJhc2VkIG9uIHRoZSBoaXN0b3JpY2FsIGRhdGEgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3RlZCBhdmVyYWdlIG1vbnRobHkgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBlbmQgdXNlclxcJ3MgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlIGZvciB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlPzogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlPzogQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U/OiBDcmFCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYElERU5USVRZX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgaWRlbnRpdHkgZm9yIHRoZSBJdGVtIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgUmVwb3J0RGVsZXRlZCA9ICdSRVBPUlRfREVMRVRFRCcsXG4gICAgRGF0YVVuYXZhaWxhYmxlID0gJ0RBVEFfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgMTA5OSB0YXggZm9ybVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXREb2N1bWVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE/OiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGb3JtMTA5OVR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmb3JtXzEwOTlfdHlwZT86IEZvcm0xMDk5VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OVJlY2lwaWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlY2lwaWVudD86IENyZWRpdDEwOTlSZWNpcGllbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlQYXllcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyPzogQ3JlZGl0MTA5OVBheWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5RmlsZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmaWxlcj86IENyZWRpdDEwOTlGaWxlcjtcbiAgICAvKipcbiAgICAgKiBUYXggeWVhciBvZiB0aGUgdGF4IGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRheF95ZWFyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcmVudCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcmVudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiByb3lhbHRpZXMgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJveWFsdGllcz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIG90aGVyIGluY29tZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb3RoZXJfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZpc2hpbmcgYm9hdCBwcm9jZWVkcyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmaXNoaW5nX2JvYXRfcHJvY2VlZHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtZWRpY2FsIGFuZCBoZWFsdGhjYXJlIHBheW1lbnRzIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lZGljYWxfYW5kX2hlYWx0aGNhcmVfcGF5bWVudHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBub25lbXBsb3llZSBjb21wZW5zYXRpb24gZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbm9uZW1wbG95ZWVfY29tcGVuc2F0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygc3Vic3RpdHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdWJzdGl0dXRlX3BheW1lbnRzX2luX2xpZXVfb2ZfZGl2aWRlbmRzX29yX2ludGVyZXN0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBwYXllciBtYWRlIGRpcmVjdCBzYWxlcyBvdmVyICQ1MDAwIG9mIGNvbnN1bWVyIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9tYWRlX2RpcmVjdF9zYWxlc19vZl81MDAwX29yX21vcmVfb2ZfY29uc3VtZXJfcHJvZHVjdHNfdG9fYnV5ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBjcm9wIGluc3VyYW5jZSBwcm9jZWVkcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY3JvcF9pbnN1cmFuY2VfcHJvY2VlZHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBnb2xkZW4gcGFyYWNodXRlIHBheW1lbnRzIG1hZGUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGV4Y2Vzc19nb2xkZW5fcGFyYWNodXRlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ3Jvc3MgcHJvY2VlZHMgcGFpZCB0byBhbiBhdHRvcm5leSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZ3Jvc3NfcHJvY2VlZHNfcGFpZF90b19hbl9hdHRvcm5leT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIDQwOUEgZGVmZXJyYWxzIGVhcm5lZCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VjdGlvbl80MDlhX2RlZmVycmFscz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIDQwOUEgaW5jb21lIGVhcm5lZCBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VjdGlvbl80MDlhX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfdGF4X3dpdGhoZWxkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygc3RhdGUgdGF4IHdpdGhoZWxkIG9mIHBheWVyIGZvciBzZWNvbmRhcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZF9sb3dlcj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfc3RhdGVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcl9sb3dlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHJlcG9ydGVkIGZvciBwcmltYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgdmFsdWVzIHdpbGwgYmUgcHJvdmlkZWQgUGF5bWVudCBjYXJkIFRoaXJkIHBhcnR5IG5ldHdvcmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3JlcG9ydGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIChYWFgpIFhYWC1YWFhYLiBQaG9uZSBudW1iZXIgb2YgdGhlIFBTRSAoUGF5bWVudCBTZXR0bGVtZW50IEVudGl0eSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBzZV90ZWxlcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBHcm9zcyBhbW91bnQgcmVwb3J0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIGNhcmQgbm90IHByZXNlbnQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBjYXJkX25vdF9wcmVzZW50X3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWVyY2hhbnRfY2F0ZWdvcnlfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHBheW1lbnQgdHJhbnNhY3Rpb25zIG1hZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG51bWJlcl9vZl9wYXltZW50X3RyYW5zYWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBKYW51YXJ5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBqYW51YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBGZWJydWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmVicnVhcnlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIE1hcmNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXJjaF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgQXByaWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGFwcmlsX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1heV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSnVuZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAganVuZV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSnVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAganVseV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgQXVndXN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhdWd1c3RfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIFNlcHRlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2VwdGVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBPY3RvYmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBvY3RvYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBOb3ZlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbm92ZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIERlY2VtYmVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkZWNlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlY29uZGFyeSBzdGF0ZSBvZiBidXNpbmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc2Vjb25kYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pbmNvbWVfdGF4PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgdGF4IHJlcG9ydGVkIGZvciBzZWNvbmRhcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZV9pbmNvbWVfdGF4PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGVyIHVzZWQgYnkgMTA5OS1LIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlGaWxlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OUZpbGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUYXggaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIGZpbGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlGaWxlclxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgcHJvdmlkZWQ6IFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkgKFBTRSksIEVsZWN0cm9uaWMgUGF5bWVudCBGYWNpbGl0YXRvciAoRVBGKSwgT3RoZXIgVGhpcmQgUGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHBheWVyIHVzZWQgYnkgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlQYXllclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OVBheWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUYXggaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlQYXllclxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVsZXBob25lIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0ZWxlcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlY2lwaWVudCB1c2VkIGluIGJvdGggMTA5OS1LIGFuZCAxMDk5LU1JU0MgdGF4IGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0MTA5OVJlY2lwaWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHRpbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgbnVtYmVyIG9mIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgRkFDVEEgaXMgYSBmaWxpbmcgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZhY3RhX2ZpbGluZ19yZXF1aXJlbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2hlY2tlZCBpZiAybmQgVElOIGV4aXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UmVjaXBpZW50XG4gICAgICovXG4gICAgc2Vjb25kX3Rpbl9leGlzdHM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHVzZSBjYXNlIG9mIHRoZSB0cmFuc2Zlci4gUmVxdWlyZWQgZm9yIHRyYW5zZmVycyBvbiBhbiBBQ0ggbmV0d29yay4gIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGVnLiBiaWxsIHBheW1lbnQgIGBcXFwid2ViXFxcImAgLSBBIGNyZWRpdCBFbnRyeSBpbml0aWF0ZWQgYnkgb3Igb24gYmVoYWxmIG9mIGEgaG9sZGVyIG9mIGEgQ29uc3VtZXIgQWNjb3VudCB0aGF0IGlzIGludGVuZGVkIGZvciBhIENvbnN1bWVyIEFjY291bnQgb2YgYSBSZWNlaXZlclxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QUNIQ2xhc3Mge1xuICAgIENjZCA9ICdjY2QnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgY3JlZGl0IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtY3JlZGl0KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFjY291bnRTdWJ0eXBlIHtcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIFRoaXMgY29udGFpbnMgYW4gYW1vdW50LCBkZW5vbWluYXRlZCBpbiB0aGUgY3VycmVuY3kgc3BlY2lmaWVkIGJ5IGVpdGhlciBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHJlcG9ydCB0b2tlbnM7IGNhbiBpbmNsdWRlIGF0IG1vc3Qgb25lIFZPQS9zdGFuZGFyZCBBc3NldCBSZXBvcnQgdG9rZW5zIGFuZCBvbmUgVk9FIEFzc2V0IFJlcG9ydCBUb2tlbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IsIHdoaWNoIGFsbG93cyB0aGVtIHRvIGZldGNoIHRoZSBBc3NldCBSZXBvcnRzIGF0dGFjaGVkIHRvIHRoZSB0b2tlbi4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHlvdSB3b3VsZCBsaWtlIHRvIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdG9rZW5zIHdoaWNoIHRoZSBzcGVjaWZpZWQgQXVkaXQgQ29weSBUb2tlbiB3aWxsIGJlIHVwZGF0ZWQgd2l0aC4gVGhlIHR5cGVzIG9mIHRva2VuIHN1cHBvcnRlZCBhcmUgYXNzZXQgcmVwb3J0IHRva2VuIGFuZCBlbXBsb3ltZW50IHJlcG9ydCB0b2tlbi4gVGhlcmUgY2FuIGJlIGF0IG1vc3QgMSBvZiBlYWNoIHRva2VuIHR5cGUgaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGJhbmsgZW1wbG95bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0QmFua0VtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBkZXBvc2l0IGZyb20gdGhpcyBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFxuICAgICAqL1xuICAgIGxhdGVzdF9kZXBvc2l0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIgZnJvbSB3aXRoaW4gdGhlIHBlcmlvZCBvZiB0aGUgZGF5cyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlYXJsaWVzdF9kZXBvc2l0X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvY3JlZGl0L3YxL2JhbmtfZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBCYW5rIEVtcGxveW1lbnQgZGF0YS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgd2lsbCBiZSBhIGRpc3RpbmN0IGJhbmsgZW1wbG95bWVudCByZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBkaWZmZXJlbnQgZW1wbG95ZXIgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBFbXBsb3ltZW50IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2FjY291bnRzOiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG59XG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQgd2FzIGdlbmVyYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIEJhbmsgRW1wbG95bWVudCByZXBvcnQgd2FzIHVuYWJsZSB0byBiZSByZXRyaWV2ZWQsIHRoZSB3YXJuaW5ncyB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZz47XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogQ3JlZGl0QmFua0luY29tZVdhcm5pbmdDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F1c2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDcmVkaXRCYW5rSW5jb21lQ2F1c2U7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIHR5cGUgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEJBTktfRU1QTE9ZTUVOVF9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGUge1xuICAgIEJhbmtFbXBsb3ltZW50V2FybmluZyA9ICdCQU5LX0VNUExPWU1FTlRfV0FSTklORydcbn1cblxuLyoqXG4gKiBUaGUgcmVwb3J0IG9mIHRoZSBCYW5rIEluY29tZSBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEluY29tZSBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgaXRlbXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgQmFuayBJbmNvbWUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogRGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIElkZW50aXR5IGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBzbyBmaWVsZCBtYXkgcmV0dXJuIGFuIGVtcHR5IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IHR5cGUuIFRoaXMgd2lsbCBhbHdheXMgYmUgYGRlcG9zaXRvcnlgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlIHtcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknXG59XG5cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeS4gTm90ZSB0aGF0IHRoZSBgQ0FTSGAgdmFsdWUgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXMgdXNlZCBvbmx5IGZvciBleGlzdGluZyBsZWdhY3kgaW1wbGVtZW50YXRpb25zLiBJdCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbmV3IGNhdGVnb3JpZXMgYENBU0hfREVQT1NJVGAgKHJlcHJlc2VudGluZyBjYXNoIG9yIGNoZWNrIGRlcG9zaXRzKSBhbmQgYFRSQU5TRkVSX0ZST01fQVBQTElDQVRJT05gIChyZXByZXNlbnRpbmcgY2FzaCB0cmFuc2ZlcnMgb3JpZ2luYXRpbmcgZnJvbSBhcHBzLCBzdWNoIGFzIFplbGxlIG9yIFZlbm1vKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVDYXVzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IENyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogV2UgdXNlIHN0YW5kYXJkIEhUVFAgcmVzcG9uc2UgY29kZXMgZm9yIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbm90aWZpY2F0aW9ucywgYW5kIG91ciBlcnJvcnMgYXJlIGZ1cnRoZXIgY2xhc3NpZmllZCBieSBgZXJyb3JfdHlwZWAuIEluIGdlbmVyYWwsIDIwMCBIVFRQIGNvZGVzIGNvcnJlc3BvbmQgdG8gc3VjY2VzcywgNDBYIGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZmFpbHVyZXMsIGFuZCA1MFggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGlzc3Vlcy4gRXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIG51bGwgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdhcm5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVFcnJvclR5cGUge1xuICAgIEludGVybmFsU2VydmVyRXJyb3IgPSAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcbiAgICBJbnN1ZmZpY2llbnRDcmVkZW50aWFscyA9ICdJTlNVRkZJQ0lFTlRfQ1JFREVOVElBTFMnLFxuICAgIEl0ZW1Mb2NrZWQgPSAnSVRFTV9MT0NLRUQnLFxuICAgIFVzZXJTZXR1cFJlcXVpcmVkID0gJ1VTRVJfU0VUVVBfUkVRVUlSRUQnLFxuICAgIENvdW50cnlOb3RTdXBwb3J0ZWQgPSAnQ09VTlRSWV9OT1RfU1VQUE9SVEVEJyxcbiAgICBJbnN0aXR1dGlvbkRvd24gPSAnSU5TVElUVVRJT05fRE9XTicsXG4gICAgSW5zdGl0dXRpb25Ob0xvbmdlclN1cHBvcnRlZCA9ICdJTlNUSVRVVElPTl9OT19MT05HRVJfU1VQUE9SVEVEJyxcbiAgICBJbnN0aXR1dGlvbk5vdFJlc3BvbmRpbmcgPSAnSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkcnLFxuICAgIEludmFsaWRDcmVkZW50aWFscyA9ICdJTlZBTElEX0NSRURFTlRJQUxTJyxcbiAgICBJbnZhbGlkTWZhID0gJ0lOVkFMSURfTUZBJyxcbiAgICBJbnZhbGlkU2VuZE1ldGhvZCA9ICdJTlZBTElEX1NFTkRfTUVUSE9EJyxcbiAgICBJdGVtTG9naW5SZXF1aXJlZCA9ICdJVEVNX0xPR0lOX1JFUVVJUkVEJyxcbiAgICBNZmFOb3RTdXBwb3J0ZWQgPSAnTUZBX05PVF9TVVBQT1JURUQnLFxuICAgIE5vQWNjb3VudHMgPSAnTk9fQUNDT1VOVFMnLFxuICAgIEl0ZW1Ob3RTdXBwb3J0ZWQgPSAnSVRFTV9OT1RfU1VQUE9SVEVEJyxcbiAgICBBY2Nlc3NOb3RHcmFudGVkID0gJ0FDQ0VTU19OT1RfR1JBTlRFRCdcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXF1ZXN0IG9wdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBCYW5rIEluY29tZSBSZXBvcnRzIHNob3VsZCBiZSBmZXRjaGVkLiBNdWx0aXBsZSByZXBvcnRzIG1heSBiZSBhdmFpbGFibGUgaWYgdGhlIHJlcG9ydCBoYXMgYmVlbiByZS1jcmVhdGVkIG9yIHJlZnJlc2hlZC4gSWYgbW9yZSB0aGFuIG9uZSByZXBvcnQgaXMgYXZhaWxhYmxlLCB0aGUgbW9zdCByZWNlbnQgcmVwb3J0cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBJbmNvbWUgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX2FjY291bnRzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzPzogQXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT47XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGlzIEl0ZW1cXCdzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpbmNvbWUgcGF5IGZyZXF1ZW5jeS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3kge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgRGFpbHkgPSAnREFJTFknLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBkYXlzIG9mIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgcmVmcmVzaC4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRheXMgcmVxdWVzdGVkIGluIHRoZSBtb3N0IHJlY2VudGx5IGdlbmVyYXRlZCBiYW5rIGluY29tZSByZXBvcnQgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0aGUgaW5jb21lIHNvdXJjZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4gaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk/OiBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBTdW1tYXJ5IGZvciBiYW5rIGluY29tZSBhY3Jvc3MgYWxsIGluY29tZSBzb3VyY2VzIGFuZCBpdGVtcyAobWF4IGhpc3Rvcnkgb2YgNzMwIGRheXMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgYWNyb3NzIGFsbCB0aGUgaW5jb21lIHNvdXJjZXMgaW4gdGhlIGVuZCB1c2VyXFwncyBJdGVtcyBmb3IgdGhlIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtYmFuay1pbmNvbWUtc3VtbWFyeS10b3RhbC1hbW91bnRzKSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3N1bW1hcnk/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+O1xufVxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb25zIGRhdGEgZm9yIHRoZSBlbmQgdXNlclxcJ3MgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvbnNcXCdzIGN1cnJlbmN5IGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgY3JlZGl0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudCwgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEluY29tZSBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYElURU1fVU5BUFBST1ZFRGA6IFVzZXIgZXhpdGVkIGZsb3cgYmVmb3JlIGdpdmluZyBwZXJtaXNzaW9uIHRvIHNoYXJlIGRhdGEgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgSXRlbVVuYXBwcm92ZWQgPSAnSVRFTV9VTkFQUFJPVkVEJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0lOQ09NRV9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZSB7XG4gICAgQmFua0luY29tZVdhcm5pbmcgPSAnQkFOS19JTkNPTUVfV0FSTklORydcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgZW5hYmxlZCBmb3IgcHJvYWN0aXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZWlyIGluY29tZSBjaGFuZ2VzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuYWJsZV93ZWJob29rczogYm9vbGVhbjtcbn1cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIGFib3V0IHRoZSBvd25lciBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lclxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHVzZXJcXCdzIGJhbmsgYWNjb3VudCByZWxhdGVkIHRvIGFuIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFuayBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgb3duZXI6IENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGVyaW9kIG9iamVjdHMsIGNvbnRhaW5pbmcgbW9yZSBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBwZXJpb2RzOiBBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Q+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGJhbmsgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgb24gdGhlIG92ZXJhbGwgcGVyaW9kIG9mIHRoZSBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0aW5nIGJhbGFuY2Ugb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBzdGFydGluZ19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIGVuZGluZ19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhhdCBtb25leSBtb3ZlZCBpbnRvIHRoZSBhY2NvdW50IChzdWNoIGFzIGEgcGF5Y2hlY2sgYmVpbmcgZGVwb3NpdGVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2Ygd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIG1hZGUsIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBhcyBpdCBhcHBlYXJzIG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycyBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGJhbmsgc3RhdGVtZW50IHVwbG9hZCBpdGVtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY3JlZGl0IGNhcmQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0aGF0IHRoaXMgbGlhYmlsaXR5IGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhcmlvdXMgaW50ZXJlc3QgcmF0ZXMgdGhhdCBhcHBseSB0byB0aGUgYWNjb3VudC4gQVBSIGluZm9ybWF0aW9uIGlzIG5vdCBwcm92aWRlZCBieSBhbGwgY2FyZCBpc3N1ZXJzOyBpZiBBUFIgZGF0YSBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGFycmF5IHdpbGwgYmUgZW1wdHkuXG4gICAgICogQHR5cGUge0FycmF5PEFQUj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhcHJzOiBBcnJheTxBUFI+O1xuICAgIC8qKlxuICAgICAqIHRydWUgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2lzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfYmFsYW5jZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBwYXltZW50IGR1ZSBmb3IgdGhlIG5leHQgYmlsbGluZyBjeWNsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTW9zdCByZWxldmFudCBmb3IgY3JlZGl0IHVzZSBjYXNlcywgYnV0IG5vdCBsaW1pdGVkIHRvIHN1Y2ggdXNlIGNhc2VzLiAgU2VlIHRoZSBbYHRheG9ub215IGNzdiBmaWxlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL2NyZWRpdC1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBjcmVkaXQgY2F0ZWdvcmllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0Q2F0ZWdvcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBoaWdoIGxldmVsIGNhdGVnb3J5IHRoYXQgY29tbXVuaWNhdGVzIHRoZSBicm9hZCBjYXRlZ29yeSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBncmFudWxhciBjYXRlZ29yeSBjb252ZXlpbmcgdGhlIHRyYW5zYWN0aW9uXFwncyBpbnRlbnQuIFRoaXMgZmllbGQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2F0ZWdvcnlcbiAgICAgKi9cbiAgICBkZXRhaWxlZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZG9jdW1lbnQuICBgUEFZU1RVQmA6IEEgcGF5c3R1Yi4gIGBCQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgVVNfVEFYX1cyYDogQSBXLTIgd2FnZSBhbmQgdGF4IHN0YXRlbWVudCBwcm92aWRlZCBieSBhIFVTIGVtcGxveWVyIHJlZmxlY3Rpbmcgd2FnZXMgZWFybmVkIGJ5IHRoZSBlbXBsb3llZS4gIGBVU19NSUxJVEFSWV9FUkFTYDogQW4gZWxlY3Ryb25pYyBSZXRpcmVtZW50IEFjY291bnQgU3RhdGVtZW50IChlUkFTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYFVTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYFVTX01JTElUQVJZX0NMRVNgOiBBIENpdmlsaWFuIExlYXZlIGFuZCBFYXJuaW5ncyBTdGF0bWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBHSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBQTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBOT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBVUkwgdG8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgZmlsZS4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgZmlsZSB0eXBlIHdpbGwgYWx3YXlzIGJlIFBERiwgYW5kIHRoZSBmaWxlIG1heSBub3QgYmUgYXZhaWxhYmxlLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYC4gSWYgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZ2VuZXJhdGUgYSBQREYgaWYgdGhlIG9yaWdpbmFsIGlzIG5vdCBhdmFpbGFibGUsIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIEZvciBEb2N1bWVudCBJbmNvbWUsIHRoaXMgZmllbGQgd2lsbCBub3QgYmUgYG51bGxgLCBhbmQgdGhlIGZpbGUgdHlwZSB3aWxsIGJlIHRoZSBvcmlnaW5hbCBmaWxlIHR5cGUgdXBsb2FkZWQgYnkgdGhlIHVzZXIuIEZvciBtb3JlIGRldGFpbHMgb24gYXZhaWxhYmxlIGZpbGUgdHlwZXMsIHNlZSB0aGUgW0RvY3VtZW50IEluY29tZV0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvaW5jb21lL3BheXJvbGwtaW5jb21lKSBkb2N1bWVudGF0aW9uLiAgVGhpcyBkb3dubG9hZCBVUkwgY2FuIG9ubHkgYmUgdXNlZCBvbmNlIGFuZCBleHBpcmVzIGFmdGVyIHR3byBtaW51dGVzLiBUbyBnZW5lcmF0ZSBhIG5ldyBkb3dubG9hZCBVUkwsIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBhZ2Fpbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZG93bmxvYWRfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBvZiB0aGUgZG9jdW1lbnQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBkb2N1bWVudCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4gIGBET0NVTUVOVF9FUlJPUmA6IFRoZSBkb2N1bWVudCBjb3VsZCBub3QgYmUgcHJvY2Vzc2VkLiBQb3NzaWJsZSBjYXVzZXMgaW5jbHVkZTogVGhlIGRvY3VtZW50IHdhcyBhbiB1bmFjY2VwdGFibGUgZG9jdW1lbnQgdHlwZSBzdWNoIGFzIGFuIG9mZmVyIGxldHRlciBvciBiYW5rIHN0YXRlbWVudCwgdGhlIGRvY3VtZW50IGltYWdlIHdhcyBjcm9wcGVkIG9yIGJsdXJyeSwgb3IgdGhlIGRvY3VtZW50IHdhcyBjb3JydXB0ZWQuICBgVU5LTk9XTmAgb3IgYG51bGxgOiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gSWYgdGhpcyBoYXBwZW5zIHJlcGVhdGVkbHksIGNvbnRhY3Qgc3VwcG9ydCBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIHVwbG9hZGVkIGRvY3VtZW50IChpZiBhdmFpbGFibGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBwYWdlX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGVtcGxveW1lbnQgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95bWVudCBpdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBlbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogVG9rZW4gdG8gcmVwcmVzZW50IHRoZSB1bmRlcmx5aW5nIEVtcGxveW1lbnQgZGF0YVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudF9yZXBvcnRfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiBlbXBsb3ltZW50IGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGVtcGxveW1lbnQsIGlmIGFwcGxpY2FibGUuIFByb3ZpZGVkIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEVtcGxveWVyVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdGl0bGUgb2YgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQbGF0Zm9ybUlkc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBsYXRmb3JtX2lkczogQ3JlZGl0UGxhdGZvcm1JZHM7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1wbG95bWVudCBmb3IgdGhlIGluZGl2aWR1YWwuIGBcXFwiRlVMTF9USU1FXFxcImA6IEEgZnVsbC10aW1lIGVtcGxveWVlLiBgXFxcIlBBUlRfVElNRVxcXCJgOiBBIHBhcnQtdGltZSBlbXBsb3llZS4gYFxcXCJDT05UUkFDVE9SXFxcImA6IEFuIGVtcGxveWVlIHR5cGljYWxseSBoaXJlZCBleHRlcm5hbGx5IHRocm91Z2ggYSBjb250cmFjdGluZyBncm91cC4gYFxcXCJURU1QT1JBUllcXFwiYDogQSB0ZW1wb3JhcnkgZW1wbG95ZWUuIGBcXFwiT1RIRVJcXFwiYDogVGhlIGVtcGxveWVlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmUgZGVmaW5lZCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZWVfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZW1wbG95ZWVcXCdzIG1vc3QgcmVjZW50IHBheXN0dWIgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9wYXlzdHViX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXREZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0RFVEFJTDogQXNzZXREZXRhaWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0T3duZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfSE9MREVSOiBBc3NldEhvbGRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmFsaWRhdGlvblNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIFZBTElEQVRJT05fU09VUkNFUzogVmFsaWRhdGlvblNvdXJjZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcuLi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVUQUlMOiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVNDUklQVElPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjQXNzZXQ+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBMYXN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaWRkbGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBNaWRkbGVOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgbW9ydGdhZ2UgbG9hbiBhZ3JlZW1lbnQgYmV0d2VlbiBvbmUgb3IgbW9yZSBib3Jyb3dlcnMgYW5kIGEgbW9ydGdhZ2UgbGVuZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVJTOiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgbG9hbi4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJTdWJqZWN0TG9hblxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hblxuICAgICAqL1xuICAgIExvYW5Sb2xlVHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGN1cnJlbnQgYW5kIHByZXZpb3VzIGlkZW50aWZpZXJzIGZvciB0aGlzIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbklkZW50aWZpZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBBcnJheTxMb2FuSWRlbnRpZmllcj47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNMb2Fuc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAgICAgKi9cbiAgICBMT0FOOiBDcmVkaXRGcmVkZGllTWFjTG9hbjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcGFydGllcyB0byBhIGRlYWwuIFRoaXMgaW5jbHVkZXMgdGhlIGRpcmVjdCBwYXJ0aWNpcGF0aW5nIHBhcnRpZXMsIHN1Y2ggYXMgYm9ycm93ZXIgYW5kIHNlbGxlciBhbmQgdGhlIGluZGlyZWN0IHBhcnRpZXMgc3VjaCBhcyB0aGUgY3JlZGl0IHJlcG9ydCBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNQYXJ0eT47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwYXJ0eSB0byBhIHRyYW5zYWN0aW9uLiBJbmNsdWRlZCBkaXJlY3QgcGFydGljaXBhbnRzIGxpa2UgdGhlIGJvcnJvd2VyIGFuZCBzZWxsZXIgYXMgd2VsbCBhcyBpbmRpcmVjdCBwYXJ0aWNpcGFudHMgc3VjaCBhcyB0aGUgZmxvb2QgY2VydGlmaWNhdGUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIElORElWSURVQUw6IENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBST0xFUzogUm9sZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNQYXJ0eVxuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVJTOiBUYXhwYXllcklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0eUluZGl2aWR1YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0RGF0ZVRpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLiBUaGUgdmFsdWUgY2FuIG9ubHkgYmUgXFxcIlJlcG9ydElEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydElkZW50aWZpZXJUeXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvblBhcmVudElkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydGluZ0luZm9ybWF0aW9uSWRlbnRpZmllcjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgREVBTDogQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyAoVk9BKSBzY2hlbWEgdmVyc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgU2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IEFycmF5PENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZm9yIHNlcnZpY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlQ6IFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgVkVSSUZJQ0FUSU9OX09GX0FTU0VUX1JFU1BPTlNFOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBzY2hlbWEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY0xvYW5zfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgTE9BTlM6IENyZWRpdEZyZWRkaWVNYWNMb2FucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1BhcnRpZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBDcmVkaXRGcmVkZGllTWFjUGFydGllcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsXG4gICAgICovXG4gICAgU0VSVklDRVM6IENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbmQgdXNlclxcJ3MgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkRlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZWFybmluZ3M6IENyZWRpdFBheVN0dWJFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IENyZWRpdFBheVN0dWJFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1Yk5ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IENyZWRpdFBheVN0dWJOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlTdHViUGF5UGVyaW9kRGV0YWlscztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVN0dWJEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheSBzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkVhcm5pbmdzVG90YWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsOiBQYXlTdHViRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRQYXlTdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNYXJpdGFsIHN0YXR1cyBvZiB0aGUgZW1wbG95ZWUgLSBlaXRoZXIgYFNJTkdMRWAgb3IgYE1BUlJJRURgIG9yIGBOT1QgTElTVEVEYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YlRheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkOiBQYXlTdHViVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5IHN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgbmV0IHBheSBmb3IgdGhlIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBleHBsaWNpdCBwYXkgYmFzaXMgb24gdGhlIHBheXN0dWIgKGlmIHByZXNlbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgSG91cmx5ID0gJ0hPVVJMWScsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJ1xufVxuXG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBib2R5IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PFBheXJvbGxJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2RvY3VtZW50cy91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZG9jdW1lbnRzL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm99XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHBheXJvbGxfaW5zdGl0dXRpb24/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB0byBiZSByZWZyZXNoZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHdoZXJlIFBsYWlkIHdpbGwgc2VuZCB0aGUgcGF5cm9sbCBpbmNvbWUgcmVmcmVzaCB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJVU0VSX1BSRVNFTkNFX1JFUVVJUkVEXFxcImAgVXNlciBwcmVzZW5jZSBpcyByZXF1aXJlZCB0byByZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb24uIGBcXFwiU1VDQ0VTU0ZVTFxcXCJgIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggd2FzIHN1Y2Nlc3NmdWwuIGBcXFwiTk9UX0ZPVU5EXFxcImAgTm8gbmV3IGRhdGEgd2FzIGZvdW5kIGFmdGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yZWZyZXNoX3N0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGEgc2V0IG9mIGlkcyByZWxhdGVkIHRvIGFuIGVtcGxveWVlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuIHN0cmluZ3MsIHdpdGggYXQgbW9zdCBvbmUgdG9rZW4gb2YgZWFjaCByZXBvcnQgdHlwZS4gQ3VycmVudGx5IG9ubHkgQXNzZXQgUmVwb3J0IHRva2VuIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY29uZGFyeV9jbGllbnRfaWRgIGlzIHRoZSBjbGllbnQgaWQgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgcmVsYXkgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2Vjb25kYXJ5X2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgd2ViaG9va3Mgd2hlbiB0aGUgU2Vjb25kYXJ5IENsaWVudCBzdWNjZXNzZnVsbHkgcmV0cmlldmVzIGFuIEFzc2V0IFJlcG9ydCBieSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgdG8gYWxsb3cgdGhlbSB0byBhY2Nlc3MgdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyB3aGVuIHRoZSByZXBvcnQgb2YgYSByZWxheSB0b2tlbiBoYXMgYmVlbiByZWZyZXNoZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSByZWxheSB0b2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhbmQgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgcmV0dXJuZWQgaW4gdGhlIG9uU3VjY2Vzcy9vbkV4aXQgY2FsbGJhY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTGluayBzZXNzaW9uIHN0YXJ0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgc2Vzc2lvbl9zdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uUmVzdWx0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBDcmVkaXRTZXNzaW9uUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgQmFuayBFbXBsb3ltZW50IExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBlbXBsb3ltZW50LiAgYE5PX0VNUExPWU1FTlRTX0ZPVU5EYDogV2UgYXR0ZW1wdGVkLCBidXQgd2VyZSB1bmFibGUgdG8gZmluZCBhbnkgZW1wbG95bWVudCBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgRU1QTE9ZRVJfTk9UX0xJU1RFRGA6IFRoZSB1c2VyIGV4cGxpY2l0bHkgaW5kaWNhdGVkIHRoYXQgdGhleSBkaWQgbm90IHNlZSB0aGVpciBjdXJyZW50IG9yIHByZXZpb3VzIGVtcGxveWVyIGluIHRoZSBsaXN0IG9mIGVtcGxveWVyIG5hbWVzIGZvdW5kLiAgYFNUQVJURURgOiBUaGUgdXNlciBiZWdhbiB0aGUgYmFuayBpbmNvbWUgcG9ydGlvbiBvZiB0aGUgbGluayBmbG93LiAgYElOVEVSTkFMX0VSUk9SYDogVGhlIHVzZXIgZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXMge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBOb0VtcGxveWVyc0ZvdW5kID0gJ05PX0VNUExPWUVSU19GT1VORCcsXG4gICAgRW1wbG95ZXJOb3RMaXN0ZWQgPSAnRU1QTE9ZRVJfTk9UX0xJU1RFRCdcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1cz86IENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU3RhdHVzIG9mIHRoZSBCYW5rIEluY29tZSBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgaW5jb21lICBgTk9fREVQT1NJVFNfRk9VTkRgOiBXZSBhdHRlbXB0ZWQsIGJ1dCB3ZXJlIHVuYWJsZSB0byBmaW5kIGFueSBpbmNvbWUgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYFVTRVJfUkVQT1JURURfTk9fSU5DT01FYDogVGhlIHVzZXIgZXhwbGljaXRseSBpbmRpY2F0ZWQgdGhhdCB0aGV5IGRvblxcJ3QgcmVjZWl2ZSBpbmNvbWUgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYFNUQVJURURgOiBUaGUgdXNlciBiZWdhbiB0aGUgYmFuayBpbmNvbWUgcG9ydGlvbiBvZiB0aGUgbGluayBmbG93LiAgYElOVEVSTkFMX0VSUk9SYDogVGhlIHVzZXIgZW5jb3VudGVyZWQgYW4gaW50ZXJuYWwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1cyB7XG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIE5vRGVwb3NpdHNGb3VuZCA9ICdOT19ERVBPU0lUU19GT1VORCcsXG4gICAgVXNlclJlcG9ydGVkTm9JbmNvbWUgPSAnVVNFUl9SRVBPUlRFRF9OT19JTkNPTUUnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBMaW5rIGVycm9yLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRXJyb3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25FcnJvciB7XG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25FcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYW4gSXRlbSBhZGQgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5lZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYXlzdHVicyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdzJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfcmV0cmlldmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW5zdGl0dXRpb24gTmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2V0IG9mIHJlc3VsdHMgZm9yIGEgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgSXRlbSBhZGRzIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgaXRlbV9hZGRfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pbmNvbWVfcmVzdWx0cz86IENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdCB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIGZvciB0aGUgdXNlci4gU2Vzc2lvbnMgd2lsbCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlc3Npb25zPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0VzJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFcyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCB5ZWFyIG9mIHRoZSBXMiBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRheF95ZWFyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIG1lZGljYXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfd2FnZXNfYW5kX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlZCB0aXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYWxsb2NhdGVkX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfOTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5vbnF1YWxpZmllZCBwbGFucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG5vbnF1YWxpZmllZF9wbGFuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94XzEyOiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgcmV0aXJlbWVudF9wbGFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXRlX2FuZF9sb2NhbF93YWdlczogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0LiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdGllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9qZWN0ZWQgbGlrZWxpaG9vZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiwgaWYgaW5pdGlhdGVkLCB3aWxsIGJlIHN1YmplY3QgdG8gYSByZXR1cm4uICBJbiB0aGUgYGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZml2ZSByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDAlIC0gMC4wMiUgICAyOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDIlIC0gMC4wNSUgICAzOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDUlIC0gMC4xJSAgIDQ6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4xJSAtIDAuNSUgICA1OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gMC41JSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBkYXNoYm9hcmQgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHRlYW0gbWVtYmVyIHdpdGggYWNjZXNzIHRvIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBEYXNoYm9hcmRVc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBkYXNoYm9hcmQgdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHR5cGUge0FycmF5PERhc2hib2FyZFVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJzOiBBcnJheTxEYXNoYm9hcmRVc2VyPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEYXNoYm9hcmRVc2VyU3RhdHVzIHtcbiAgICBJbnZpdGVkID0gJ2ludml0ZWQnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIERlYWN0aXZhdGVkID0gJ2RlYWN0aXZhdGVkJ1xufVxuXG4vKipcbiAqIEEgZGF0ZSByYW5nZSB3aXRoIGEgc3RhcnQgYW5kIGVuZCBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhdGVSYW5nZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhdGVSYW5nZVxuICAgICAqL1xuICAgIGJlZ2lubmluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsOiBEZWR1Y3Rpb25zVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNUb3RhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9uc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSB0b3RhbCBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGRldGVjdGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIHRoZSB3ZWJob29rIHJlbGF0ZXMgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF91c2VyOiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtIHtcbiAgICBVcyA9ICdVUycsXG4gICAgQ2EgPSAnQ0EnXG59XG5cbi8qKlxuICogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjY2VzcyB0b2tlbiBmb3IgdGhlIHRhcmdldCBJdGVtLCB0eXBpY2FsbHkgcHJvdmlkZWQgaW4gdGhlIEltcG9ydCBJdGVtIHJlc3BvbnNlLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZCBBY2NvdW50IElEIHRoYXQgc3BlY2lmaWVzIHRoZSB0YXJnZXQgYmFuayBhY2NvdW50LiBUaGlzIGFjY291bnQgd2lsbCBiZWNvbWUgdGhlIHJlY2lwaWVudCBmb3IgYSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIGNhbm5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyB3aGVuIHRoZSBzdGF0dXMgb2YgYSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdHJhbnNhY3Rpb24gaXRlbXMgdG8gdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBtYXRjaCB0aGUgdXNlciB0byB0aGVpciBQYXlyb2xsIFByb3ZpZGVyLiBUaGVzZSB0b2tlbnMgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBzYW1lIGNsaWVudCBpZCBhcyB0aGUgb25lIGNyZWF0aW5nIHRoZSBzd2l0Y2gsIGFuZCBoYXZlIGFjY2VzcyB0byB0aGUgdHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2l0ZW1fYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiREVQT1NJVF9TV0lUQ0hcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFxcXCJTV0lUQ0hfU1RBVEVfVVBEQVRFXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgYGluaXRpYWxpemVkYDogVGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIHVzZXIgZW50ZXJpbmcgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHN1Ym1pdCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIGBwcm9jZXNzaW5nYDogVGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGJlZW4gc3VibWl0dGVkIGFuZCBpcyBiZWluZyBwcm9jZXNzZWQuICBgY29tcGxldGVkYDogVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgYW5kIGNvbXBsZXRlZCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIGBlcnJvcmA6IFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW0RlcG9zaXQgU3dpdGNoIEFQSSByZWZlcmVuY2VdKC9kb2NzL2RlcG9zaXQtc3dpdGNoL3JlZmVyZW5jZSNkZXBvc2l0X3N3aXRjaGdldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgZm9yIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb24gYWNjb3VudCwgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyIGluIHRoZSBEZXBvc2l0IFN3aXRjaCBpbnRlcmZhY2UuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIG9ubGluZSBiYW5raW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncydcbn1cblxuLyoqXG4gKiBUaGUgZGVwb3NpdCBzd2l0Y2ggdGFyZ2V0IHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdpdmVuIG5hbWUgKGZpcnN0IG5hbWUpIG9mIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmYW1pbHkgbmFtZSAobGFzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBvZiB0aGUgdXNlci4gVGhlIGVuZHBvaW50IGNhbiBhY2NlcHQgYSB2YXJpZXR5IG9mIHBob25lIG51bWJlciBmb3JtYXRzLCBpbmNsdWRpbmcgRS4xNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgZW1haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHRheHBheWVyIElEIG9mIHRoZSB1c2VyLCBnZW5lcmFsbHkgdGhlaXIgU1NOLCBFSU4sIG9yIFRJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIHRheF9wYXllcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERlcG9zaXQgc3dpdGNoIHRva2VuLCB1c2VkIHRvIGluaXRpYWxpemUgTGluayBmb3IgdGhlIERlcG9zaXQgU3dpdGNoIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXhwaXJhdGlvbiB0aW1lIG9mIHRoZSB0b2tlbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogT3JpZ2luYXRvciBhbmQgdGhlaXIgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERldGFpbGVkT3JpZ2luYXRvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogQSBwb3NzaWJsZSBhY2NvdW50IGRldGVjdGVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERldGVjdGVkQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGV0ZWN0ZWRBY2NvdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIGFjY291bnQgdHlwZSAoZGVwb3NpdG9yeSwgY3JlZGl0LCBsb2FuLCBpbnZlc3RtZW50IGV0Yy4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0ZWN0ZWQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9ucyB0by9mcm9tIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG5ld2VzdCB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgbmV3ZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgbmV3ZXN0X3RyYW5zYWN0aW9uX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2Ygb3V0ZmxvdyBhbW91bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBpbmZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfaW5mbG93czogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBET0NVTUVOVF9UWVBFX1BBWVNUVUJgOiBBIHBheXN0dWIuICBgRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX0dJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYERPQ1VNRU5UX1RZUEVfTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jVHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEb2N1bWVudFR5cGVQYXlzdHViID0gJ0RPQ1VNRU5UX1RZUEVfUEFZU1RVQicsXG4gICAgRG9jdW1lbnRUeXBlQmFua1N0YXRlbWVudCA9ICdET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheFcyID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5RXJhcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlMZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlDbGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFUycsXG4gICAgRG9jdW1lbnRUeXBlR2lnID0gJ0RPQ1VNRU5UX1RZUEVfR0lHJyxcbiAgICBEb2N1bWVudFR5cGVOb25lID0gJ0RPQ1VNRU5UX1RZUEVfTk9ORScsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5TWlzYyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X01JU0MnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OUsgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9LJyxcbiAgICBEb2N1bWVudFR5cGVQbGFpZEdlbmVyYXRlZFBheXN0dWJQZGYgPSAnRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREYnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbn1cbi8qKlxuICogSGlnaCBsZXZlbCBzdW1tYXJ5IG9mIHdoZXRoZXIgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBtYXRjaGVzIHRoZSBmb3JtYXR0aW5nIHJ1bGVzIGFuZCBzZWN1cml0eSBjaGVja3MgZm9yIHRoZSBhc3NvY2lhdGVkIGp1cmlzZGljdGlvbi4gIEZvciBleGFtcGxlLCBtb3N0IGlkZW50aXR5IGRvY3VtZW50cyBoYXZlIGZvcm1hdHRpbmcgcnVsZXMgbGlrZSB0aGUgZm9sbG93aW5nOiAgIFRoZSBpbWFnZSBvZiB0aGUgcGVyc29uXFwncyBmYWNlIG11c3QgaGF2ZSBhIGNlcnRhaW4gY29udHJhc3QgaW4gb3JkZXIgdG8gaGlnaGxpZ2h0IHNraW4gdG9uZSAgIFRoZSBzdWJqZWN0IGluIHRoZSBkb2N1bWVudFxcJ3MgaW1hZ2UgbXVzdCByZW1vdmUgZXllIGdsYXNzZXMgYW5kIHBvc2UgaW4gYSBjZXJ0YWluIHdheSAgIFRoZSBpbmZvcm1hdGlvbmFsIGZpZWxkcyAobmFtZSwgZGF0ZSBvZiBiaXJ0aCwgSUQgbnVtYmVyLCBldGMuKSBtdXN0IGJlIGNvbG9yZWQgYW5kIGFsaWduZWQgYWNjb3JkaW5nIHRvIHNwZWNpZmljIHJ1bGVzICAgU2VjdXJpdHkgZmVhdHVyZXMgbGlrZSB3YXRlcm1hcmtzIGFuZCBiYWNrZ3JvdW5kIHBhdHRlcm5zIG11c3QgYmUgcHJlc2VudCAgU28gYSBgbWF0Y2hgIHN0YXR1cyBmb3IgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgZG9jdW1lbnQgaW4gdGhlIHByb3ZpZGVkIGltYWdlIHNlZW1zIHRvIGNvbmZvcm0gdG8gdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBhbmQgc2VjdXJpdHkgcnVsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXRlY3RlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50QXV0aGVudGljaXR5TWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEEgbWF0Y2ggc3VtbWFyeSBkZXNjcmliaW5nIHRoZSBjcm9zcyBjb21wYXJpc29uIGJldHdlZW4gdGhlIHN1YmplY3RcXCdzIGRhdGUgb2YgYmlydGgsIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbWFnZSwgYW5kIHRoZSBkYXRlIG9mIGJpcnRoIHRoZXkgc2VwYXJhdGVseSBwcm92aWRlZCB0byB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBtZXRhZGF0YSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHRoYXQgaXMgYWxzbyBwcmVzZW50IGluIHRoZSBwYXlzdHViIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY1R5cGV9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2NfdHlwZT86IERvY1R5cGU7XG59XG4vKipcbiAqIEEgbWF0Y2ggc3VtbWFyeSBkZXNjcmliaW5nIHRoZSBjcm9zcyBjb21wYXJpc29uIGJldHdlZW4gdGhlIHN1YmplY3RcXCdzIG5hbWUsIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbWFnZSwgYW5kIHRoZSBuYW1lIHRoZXkgc2VwYXJhdGVseSBwcm92aWRlZCB0byBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50TmFtZU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBjZXJ0YWluIHJlYXNvbiBhcyB0byB3aHkgYSBkb2N1bWVudCBjb3VsZCBwb3RlbnRpYWxseSBiZSBmcmF1ZHVsZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHQgZnJvbSB0aGUgcmlzayBzaWduYWwgY2hlY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgd2hpY2ggdGhlIHJpc2sgc2lnbmFsIHdhcyBjb21wdXRlZCBmb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBmaWVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdXNlZCB0byBxdWlja2x5IGlkZW50aWZ5IGlmIHRoZSBzaWduYWwgaW5kaWNhdGVzIHRoYXQgdGhpcyBmaWVsZCBpcyBhdXRoZW50aWMgb3IgZnJhdWR1bGVudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBoYXNfZnJhdWRfcmlzazogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX21ldGFkYXRhOiBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgdmFsdWUgb2YgdGhlIGZpZWxkLCBhcyBzZWVuIG9uIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGV4cGVjdGVkX3ZhbHVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXJpdmVkIHZhbHVlIG9idGFpbmVkIGluIHRoZSByaXNrIHNpZ25hbCBjYWxjdWxhdGlvbiBwcm9jZXNzIGZvciB0aGlzIGZpZWxkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgYWN0dWFsX3ZhbHVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gcHJvdmlkaW5nIG1vcmUgZGV0YWlsIGludG8gdGhlIHBhcnRpY3VsYXIgcmlzayBzaWduYWxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBzaWduYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaXNrIHNpZ25hbFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHBhZ2VfbnVtYmVyOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYWRkaXRpb25hbCBtZXRhZGF0YSBhYm91dCB0aGUgaW5zdGl0dXRpb24gdXNlZCB0byBjb21wdXRlIHRoZSB2ZXJpZmljYXRpb24gYXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZnJhdWQgcmlzayBkYXRhIGZvciBhIHNldCBvZiBpbmNvbWUgZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBkb2N1bWVudCBtZXRhZGF0YSBhbmQgYXNzb2NpYXRlZCByaXNrIHNpZ25hbHMgcGVyIGRvY3VtZW50XG4gICAgICogQHR5cGUge0FycmF5PFNpbmdsZURvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBzaW5nbGVfZG9jdW1lbnRfcmlza19zaWduYWxzOiBBcnJheTxTaW5nbGVEb2N1bWVudFJpc2tTaWduYWw+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHJpc2sgc2lnbmFscyBjb21wdXRlZCBmcm9tIGEgc2V0IG9mIHVwbG9hZGVkIGRvY3VtZW50cyBhbmQgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnRzXFwnIG1ldGFkYXRhXG4gICAgICogQHR5cGUge0FycmF5PE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIG11bHRpX2RvY3VtZW50X3Jpc2tfc2lnbmFsczogQXJyYXk8TXVsdGlEb2N1bWVudFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBBIHN1bW1hcnkgYWNyb3NzIGFsbCByaXNrIHNpZ25hbHMgYXNzb2NpYXRlZCB3aXRoIGEgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwLCBpbmNsdXNpdmUsIHdoZXJlIGEgc2NvcmUgY2xvc2VyIHRvIDAgaW5kaWNhdGVzIGEgZG9jdW1lbnQgaXMgbGlrZWx5IHRvIGJlIHRydXN0d29ydGh5IGFuZCBhIHNjb3JlIGNsb3NlciB0byAxMDAgaW5kaWNhdGVzIGEgZG9jdW1lbnQgaXMgbGlrZWx5IHRvIGJlIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19zY29yZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgZG9jdW1lbnQgc3VibWlzc2lvbi4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnXG59XG5cbi8qKlxuICogRGF0YSwgaW1hZ2VzLCBhbmFseXNpcywgYW5kIHJlc3VsdHMgZnJvbSB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkb2N1bWVudHMgc3VibWl0dGVkIHRvIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbiwgd2hlcmUgZWFjaCBzdWJtaXNzaW9uIHdpbGwgY29udGFpbiBib3RoIGEgZnJvbnQgYW5kIGJhY2sgaW1hZ2UsIG9yIGp1c3QgYSBmcm9udCBpbWFnZSwgZGVwZW5kaW5nIG9uIHRoZSBkb2N1bWVudCB0eXBlLiAgTm90ZTogUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGxldCBhIHVzZXIgc3VibWl0IGEgbmV3IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgdXAgdG8gdGhyZWUgdGltZXMgaWYgd2UgZGV0ZWN0IHRoYXQgYSBwcmV2aW91cyBhdHRlbXB0IG1pZ2h0IGhhdmUgZmFpbGVkIGR1ZSB0byB1c2VyIGVycm9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgYXJlIGJsdXJyeSBvciBvYnNjdXJlZCBieSBnbGFyZSwgdGhlIHVzZXIgd2lsbCBiZSBhc2tlZCB0byBjYXB0dXJlIHRoZWlyIGRvY3VtZW50cyBhZ2FpbiwgcmVzdWx0aW5nIGluIGF0IGxlYXN0IHR3byBzZXBhcmF0ZSBlbnRyaWVzIHdpdGhpbiBgZG9jdW1lbnRzYC4gSWYgdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaXMgYGZhaWxlZGAsIHRoZSB1c2VyIGhhcyBleGhhdXN0ZWQgdGhlaXIgcmV0cnkgYXR0ZW1wdHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRvY3VtZW50czogQXJyYXk8RG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudD47XG59XG4vKipcbiAqIEltYWdlcywgZXh0cmFjdGVkIGRhdGEsIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3MgaWRlbnRpdHkgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogRG9jdW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IGRvY3VtZW50IHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50SW1hZ2VzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgaW1hZ2VzOiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBhbmFseXNpczogRG9jdW1lbnRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5ncyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8RWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5nc0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgQmFzaWNBbGxvd2FuY2VIb3VzaW5nID0gJ0JBU0lDIEFMTE9XQU5DRSBIT1VTSU5HJyxcbiAgICBCYXNpY0FsbG93YW5jZVN1YnNpc3RlbmNlID0gJ0JBU0lDIEFMTE9XQU5DRSBTVUJTSVNURU5DRScsXG4gICAgT3RoZXIgPSAnT1RIRVInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbWFpbCBhZGRyZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbWFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGVtYWlsIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBlbWFpbCBhY2NvdW50IGFzIGRlc2NyaWJlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgdHlwZTogRW1haWxUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBFbWFpbFR5cGVFbnVtIHtcbiAgICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxuICAgIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGVtYWlsIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgZW1haWwgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIGVtYWlsLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoLCA5OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2ggKG1hdGNoaW5nIHRoZSBzYW1lIGVtYWlsIHdpdGggZGlmZmVyZW50IFxcJytcXCcgZXh0ZW5zaW9ucyksIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBlbWFpbCBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgc2luZ2xlYCBvciBgbWFycmllZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ/OiBUYXhwYXllcklEO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IEFkZHJlc3NEYXRhTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGZyb20gMCB0byAxIGluZGljYXRpbmcgUGxhaWRcXCdzIGxldmVsIG9mIGNvbmZpZGVuY2UgaW4gdGhlIHBhaXJpbmcgYmV0d2VlbiB0aGUgZW1wbG95ZXIgYW5kIHRoZSBpbnN0aXR1dGlvbiAobm90IHlldCBpbXBsZW1lbnRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX3Njb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciwgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGVtcGxveWVyIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyVmVyaWZpY2F0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBuYW1lIHRvIGJlIHNlYXJjaGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgcHJvZHVjdHMgdGhlIHJldHVybmVkIGVtcGxveWVycyBzaG91bGQgc3VwcG9ydC4gQ3VycmVudGx5LCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGBcXFwiZGVwb3NpdF9zd2l0Y2hcXFwiYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3llcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyczogQXJyYXk8RW1wbG95ZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBlbXBsb3ltZW50IGRldGFpbHMgZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYW5udWFsX3NhbGFyeT86IFBheTtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9uIHdoaWNoIHRoZSBlbXBsb3llZSB3YXMgaGlyZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGhpcmVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRTb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWxcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzPzogRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgb2YgZW1wbG95bWVudCwgaWYgYXBwbGljYWJsZS4gUHJvdmlkZWQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYXRmb3JtSWRzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGxhdGZvcm1faWRzPzogUGxhdGZvcm1JZHM7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95bWVudCB2ZXJpZmljYXRpb24gc3VtbWFyaWVzLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEN1cnJlbnQgZW1wbG95bWVudCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBFbXBsb3ltZW50U3RhdHVzQWN0aXZlID0gJ0VNUExPWU1FTlRfU1RBVFVTX0FDVElWRScsXG4gICAgRW1wbG95bWVudFN0YXR1c0luYWN0aXZlID0gJ0VNUExPWU1FTlRfU1RBVFVTX0lOQUNUSVZFJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5oYW5jZW1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbmhhbmNlbWVudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VtZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHdlYnNpdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDaGFubmVsfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVuaGFuY2VtZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PENvdW50ZXJwYXJ0eT47XG59XG4vKipcbiAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhY2NvdW50IGhvbGRlcjogIGBPVVRGTE9XYCAtIEluY2x1ZGVzIG91dGdvaW5nIHRyYW5zZmVycywgcHVyY2hhc2VzLCBhbmQgZmVlcy4gKFR5cGljYWxseSByZXByZXNlbnRlZCBhcyBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNoZWNraW5nIGFjY291bnRzIGFuZCBkZWJpdCBjYXJkcyBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjcmVkaXQgY2FyZHMuKSAgYElORkxPV2AgLSBJbmNsdWRlcyBpbmNvbWluZyB0cmFuc2ZlcnMsIHJlZnVuZHMsIGFuZCBpbmNvbWUuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBwb3NpdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgbmVnYXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLilcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uIHtcbiAgICBJbmZsb3cgPSAnSU5GTE9XJyxcbiAgICBPdXRmbG93ID0gJ09VVEZMT1cnXG59XG5cbi8qKlxuICogQSBncm91cGluZyBvZiB0aGUgUGxhaWQgcHJvZHVjZWQgdHJhbnNhY3Rpb24gZW5yaWNobWVudCBmaWVsZHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVucmljaG1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnJpY2htZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzOiBBcnJheTxDb3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIFdlIHJlY29tbWVuZCB1c2luZyB0aGUgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGZvciB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiB0byBvYnRhaW4gdGhlIGJlc3QgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgbGVnYWN5IGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhY3lfY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFBheW1lbnRDaGFubmVsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5X2NvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmVuY2V9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcmVjdXJyZW5jZT86IFJlY3VycmVuY2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2ZmaWNpYWwgZG9jdW1lbnQsIHVzdWFsbHkgaXNzdWVkIGJ5IGEgZ292ZXJuaW5nIGJvZHkgb3IgaW5zdGl0dXRpb24sIHdpdGggYW4gYXNzb2NpYXRlZCBpZGVudGlmaWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlEb2N1bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIHR5cGU6IEVudGl0eURvY3VtZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaWtgIC0gUnVzc2lhbiBiYW5rIGNvZGUgIGBidXNpbmVzc19udW1iZXJgIC0gQSBudW1iZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBidXNpbmVzcyB3aXRoaW4gYSBjYXRlZ29yeSBvZiBidXNpbmVzc2VzICBgaW1vYCAtIE51bWJlciBhc3NpZ25lZCB0byB0aGUgZW50aXR5IGJ5IHRoZSBJbnRlcm5hdGlvbmFsIE1hcml0aW1lIE9yZ2FuaXphdGlvbiAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgc3dpZnRgIC0gTnVtYmVyIGlkZW50aWZ5aW5nIGEgYmFuayBhbmQgYnJhbmNoLiAgYHRheF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbGxlY3RpbmcgdGF4ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eURvY3VtZW50VHlwZSB7XG4gICAgQmlrID0gJ2JpaycsXG4gICAgQnVzaW5lc3NOdW1iZXIgPSAnYnVzaW5lc3NfbnVtYmVyJyxcbiAgICBJbW8gPSAnaW1vJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgU3dpZnQgPSAnc3dpZnQnLFxuICAgIFRheElkID0gJ3RheF9pZCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgZW50aXR5IGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRvY3VtZW50cz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc2VzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICB1cmxzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZW50aXR5IHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AgdGhhdCB3ZXJlIGNvbXBhcmVkIHdoZW4gdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gZW50aXR5IHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgLCB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIGVudGl0eSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdERhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBFbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBMb2NhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IEFycmF5PEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBOYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz47XG4gICAgLyoqXG4gICAgICogVVJMcyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIHVybHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRVcmxzSXRlbXM+O1xufVxuLyoqXG4gKiBBbmFseXplZCBkb2N1bWVudHMgZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5RG9jdW1lbnQ7XG59XG4vKipcbiAqIEVtYWlsIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdHNQaG9uZU51bWJlckl0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFNob3J0aGFuZCBpZGVudGlmaWVyIGZvciBhIHNwZWNpZmljIHNjcmVlbmluZyBsaXN0IGZvciBlbnRpdGllcy4gIGBBVV9DT05gOiBBdXN0cmFsaWEgRGVwYXJ0bWVudCBvZiBGb3JlaWduIEFmZmFpcnMgYW5kIFRyYWRlIENvbnNvbGlkYXRlZCBMaXN0ICBgQ0FfQ09OYDogR292ZXJubWVudCBvZiBDYW5hZGEgQ29uc29saWRhdGVkIExpc3Qgb2YgU2FuY3Rpb25zICBgRVVfQ09OYDogRXVyb3BlYW4gRXh0ZXJuYWwgQWN0aW9uIFNlcnZpY2UgQ29uc29saWRhdGVkIExpc3QgIGBJWl9TT0VgOiBTdGF0ZSBPd25lZCBFbnRlcnByaXNlIExpc3QgIGBJWl9VTkNgOiBVbml0ZWQgTmF0aW9ucyBDb25zb2xpZGF0ZWQgU2FuY3Rpb25zICBgSVpfV0JLYDogV29ybGQgQmFuayBMaXN0aW5nIG9mIEluZWxpZ2libGUgRmlybXMgYW5kIEluZGl2aWR1YWxzICBgVVNfQ0FQYDogVVMgT0ZBQyBDb3JyZXNwb25kZW50IEFjY291bnQgb3IgUGF5YWJsZS1UaHJvdWdoIEFjY291bnQgU2FuY3Rpb25zICBgVVNfRlNFYDogVVMgT0ZBQyBGb3JlaWduIFNhbmN0aW9ucyBFdmFkZXJzICBgVVNfTUJTYDogVVMgTm9uLVNETiBNZW51LUJhc2VkIFNhbmN0aW9ucyAgYFVTX1NETmA6IFVTIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgVVNfQ01DYDogVVMgT0ZBQyBOb24tU0ROIENoaW5lc2UgTWlsaXRhcnktSW5kdXN0cmlhbCBDb21wbGV4IExpc3QgIGBVU19VVkxgOiBCdXJlYXUgb2YgSW5kdXN0cnkgYW5kIFNlY3VyaXR5IFVudmVyaWZpZWQgTGlzdCAgYFVLX0hNQ2A6IFVLIEhNIFRyZWFzdXJ5IENvbnNvbGlkYXRlZCBMaXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlXYXRjaGxpc3RDb2RlIHtcbiAgICBDYUNvbiA9ICdDQV9DT04nLFxuICAgIEV1Q29uID0gJ0VVX0NPTicsXG4gICAgSXpTb2UgPSAnSVpfU09FJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVXNDYXAgPSAnVVNfQ0FQJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzTWJzID0gJ1VTX01CUycsXG4gICAgVXNTZG4gPSAnVVNfU0ROJyxcbiAgICBVc1NzaSA9ICdVU19TU0knLFxuICAgIFVzQ21jID0gJ1VTX0NNQycsXG4gICAgVXNVdmwgPSAnVVNfVVZMJyxcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIFVrSG1jID0gJ1VLX0hNQydcbn1cblxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGVudGl0aWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEVudGl0eVdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIGVudGl0eSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgT3JnYW5pemF0aW9uc1xcXCIgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nIGhpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHJldmlld19zdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZmlyc3RfYWN0aXZlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGluYWN0aXZlX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3NpbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEVudGl0eVdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBhc3NvY2lhdGVkIHdpdGggYW4gZW50aXR5IHVzZWQgZm9yIHNlYXJjaGluZyBhZ2FpbnN0IHdhdGNobGlzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQgd2FzIGV4cGlyZWQgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIHdhcyBwZXJmb3JtZWQuICBOb3RlOiBJbiB0aGUgY2FzZSB3aGVyZSBhbiBleHBpcmF0aW9uIGRhdGUgaXMgbm90IHByZXNlbnQgb24gdGhlIGRvY3VtZW50IG9yIGZhaWxlZCB0byBiZSBleHRyYWN0ZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFeHBpcmF0aW9uRGF0ZSB7XG4gICAgTm90RXhwaXJlZCA9ICdub3RfZXhwaXJlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIHBheW1lbnQgY29uc2VudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gcmVxdWVzdCByZWZ1bmQgZGV0YWlscyBmcm9tIHRoZSBwYXllZVxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgU3VwcG9ydCB2YXJpZXMgYmV0d2VlbiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCB3aWxsIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLiAgSWYgcmVmdW5kIGRldGFpbHMgY291bGQgYmUgcmV0cmlldmVkLCB0aGV5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQgaWYgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgYmFjcz86IFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgZXh0ZXJuYWwgcGF5bWVudCByZWZ1bmRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaG9sZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBiYWNzOiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgaW50ZXJ2YWw/OiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGludGVydmFsX2V4ZWN1dGlvbl9kYXk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVHlwZXMgb2YgZG9jdW1lbnQgZm9ybWF0cy4gKFN1Z2dlc3RlZCB2YWx1ZXMpXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhDb250ZW50VHlwZXMge1xuICAgIEFwcGxpY2F0aW9uUGRmID0gJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgSW1hZ2VHaWYgPSAnaW1hZ2UvZ2lmJyxcbiAgICBJbWFnZUpwZWcgPSAnaW1hZ2UvanBlZycsXG4gICAgSW1hZ2VUaWZmID0gJ2ltYWdlL3RpZmYnLFxuICAgIEltYWdlUG5nID0gJ2ltYWdlL3BuZycsXG4gICAgQXBwbGljYXRpb25Kc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nXG59XG5cbi8qKlxuICogRmluYW5jaWFsIEluc3RpdHV0aW9uIHByb3ZpZGVyLXNwZWNpZmljIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRkRYRmlBdHRyaWJ1dGUge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgYXR0cmlidXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYXR0cmlidXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBSRVNUIGFwcGxpY2F0aW9uIGNvbnN0cmFpbnQgKEh5cGVybWVkaWEgQXMgVGhlIEVuZ2luZSBPZiBBcHBsaWNhdGlvbiBTdGF0ZSlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYSGF0ZW9hc0xpbmtcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rIHtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gaW52b2tlIHRoZSBhY3Rpb24gb24gdGhlIHJlc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICBocmVmOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rQWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGFjdGlvbj86IEZEWEhhdGVvYXNMaW5rQWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFJlbGF0aW9uIG9mIHRoaXMgbGluayB0byBpdHMgY29udGFpbmluZyBlbnRpdHksIGFzIGRlZmluZWQgYnkgYW5kIHdpdGggbWFueSBleGFtcGxlIHJlbGF0aW9uIHZhbHVlcyBhdCBbSUVURiBSRkM1OTg4XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzU5ODgpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICByZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29udGVudC10eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICogQHR5cGUge0FycmF5PEZEWENvbnRlbnRUeXBlcz59XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgdHlwZXM/OiBBcnJheTxGRFhDb250ZW50VHlwZXM+O1xufVxuLyoqXG4gKiBIVFRQIE1ldGhvZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhIYXRlb2FzTGlua0FjdGlvbiB7XG4gICAgR2V0ID0gJ0dFVCcsXG4gICAgUG9zdCA9ICdQT1NUJyxcbiAgICBQYXRjaCA9ICdQQVRDSCcsXG4gICAgRGVsZXRlID0gJ0RFTEVURScsXG4gICAgUHV0ID0gJ1BVVCdcbn1cblxuLyoqXG4gKiBJbml0aWF0b3IgRmkgQXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgdmFsdWU/OiBGRFhQYXJ0eVR5cGU7XG59XG4vKipcbiAqIFByb3ZpZGVzIHRoZSBiYXNlIGZpZWxkcyBvZiBhIG5vdGlmaWNhdGlvbi4gQ2xpZW50cyB3aWxsIHJlYWQgdGhlIGB0eXBlYCBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBJZCBvZiBub3RpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBub3RpZmljYXRpb25JZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB0eXBlOiBGRFhOb3RpZmljYXRpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIElTTyA4NjAxIGRhdGUtdGltZSBpbiBmb3JtYXQgXFwnWVlZWS1NTS1ERFRoaDptbTpzcy5ubm5bWnxbK3wtXWhoOm1tXVxcJyBhY2NvcmRpbmcgdG8gW0lFVEYgUkZDMzMzOV0oaHR0cHM6Ly94bWwycmZjLnRvb2xzLmlldGYub3JnL3B1YmxpYy9yZmMvaHRtbC9yZmMzMzM5Lmh0bWwjYW5jaG9yMTQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VudE9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvbkNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBjYXRlZ29yeTogRkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblNldmVyaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZXZlcml0eT86IEZEWE5vdGlmaWNhdGlvblNldmVyaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25Qcmlvcml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBGRFhOb3RpZmljYXRpb25Qcmlvcml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHB1Ymxpc2hlcj86IEZEWFBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgc3Vic2NyaWJlcj86IEZEWFBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhOb3RpZmljYXRpb25QYXlsb2FkfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBub3RpZmljYXRpb25QYXlsb2FkOiBGRFhOb3RpZmljYXRpb25QYXlsb2FkO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhIYXRlb2FzTGlua31cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgdXJsPzogRkRYSGF0ZW9hc0xpbms7XG59XG4vKipcbiAqIENhdGVnb3J5IG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnkge1xuICAgIFNlY3VyaXR5ID0gJ1NFQ1VSSVRZJyxcbiAgICBNYWludGVuYW5jZSA9ICdNQUlOVEVOQU5DRScsXG4gICAgRnJhdWQgPSAnRlJBVUQnLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCcsXG4gICAgTmV3RGF0YSA9ICdORVdfREFUQSdcbn1cblxuLyoqXG4gKiBDdXN0b20ga2V5LXZhbHVlIHBhaXJzIHBheWxvYWQgZm9yIGEgbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIElEIGZvciB0aGUgb3JpZ2luYXRpb24gZW50aXR5IHJlbGF0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkVHlwZT86IEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEZEWEZpQXR0cmlidXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGN1c3RvbUZpZWxkcz86IEFycmF5PEZEWEZpQXR0cmlidXRlPjtcbn1cbi8qKlxuICogVHlwZSBvZiBlbnRpdHkgY2F1c2luZyBvcmlnaW5hdGlvbiBvZiBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZSB7XG4gICAgQWNjb3VudCA9ICdBQ0NPVU5UJyxcbiAgICBDdXN0b21lciA9ICdDVVNUT01FUicsXG4gICAgUGFydHkgPSAnUEFSVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogUHJpb3JpdHkgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25Qcmlvcml0eSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBNZWRpdW0gPSAnTUVESVVNJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFNldmVyaXR5IGxldmVsIG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHkge1xuICAgIEVtZXJnZW5jeSA9ICdFTUVSR0VOQ1knLFxuICAgIEFsZXJ0ID0gJ0FMRVJUJyxcbiAgICBXYXJuaW5nID0gJ1dBUk5JTkcnLFxuICAgIE5vdGljZSA9ICdOT1RJQ0UnLFxuICAgIEluZm8gPSAnSU5GTydcbn1cblxuLyoqXG4gKiBUeXBlIG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uVHlwZSB7XG4gICAgQ29uc2VudFJldm9rZWQgPSAnQ09OU0VOVF9SRVZPS0VEJyxcbiAgICBDb25zZW50VXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnLFxuICAgIEN1c3RvbSA9ICdDVVNUT00nLFxuICAgIFNlcnZpY2UgPSAnU0VSVklDRScsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBQbGFubmVkT3V0YWdlID0gJ1BMQU5ORURfT1VUQUdFJ1xufVxuXG4vKipcbiAqIEZEWCBQYXJ0aWNpcGFudCAtIGFuIGVudGl0eSBvciBwZXJzb24gdGhhdCBpcyBhIHBhcnQgb2YgYSBGRFggQVBJIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWFBhcnR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGRFhQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogSHVtYW4gcmVjb2duaXphYmxlIGNvbW1vbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBGRFhQYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVVJJIGZvciBwYXJ0eSwgd2hlcmUgYW4gZW5kIHVzZXIgY291bGQgbGVhcm4gbW9yZSBhYm91dCB0aGUgY29tcGFueSBvciBhcHBsaWNhdGlvbiBpbnZvbHZlZCBpbiB0aGUgZGF0YSBzaGFyaW5nIGNoYWluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBob21lVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgYSBsb2dvIGFzc2V0IHRvIGJlIGRpc3BsYXllZCB0byB0aGUgZW5kIHVzZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIGxvZ29Vcmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5UmVnaXN0cnl9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0cnk/OiBGRFhQYXJ0eVJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgbmFtZSBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJlZCBpZCBvZiBwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJlZEVudGl0eUlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cnkgY29udGFpbmluZyB0aGUgcGFydHnigJlzIHJlZ2lzdHJhdGlvbiB3aXRoIG5hbWUgYW5kIGlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVJlZ2lzdHJ5IHtcbiAgICBGZHggPSAnRkRYJyxcbiAgICBHbGVpZiA9ICdHTEVJRicsXG4gICAgSWNhbm4gPSAnSUNBTk4nLFxuICAgIFByaXZhdGUgPSAnUFJJVkFURSdcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGEgcGFydHlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZEWFBhcnR5VHlwZSB7XG4gICAgRGF0YUFjY2Vzc1BsYXRmb3JtID0gJ0RBVEFfQUNDRVNTX1BMQVRGT1JNJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgRGF0YVJlY2lwaWVudCA9ICdEQVRBX1JFQ0lQSUVOVCcsXG4gICAgSW5kaXZpZHVhbCA9ICdJTkRJVklEVUFMJyxcbiAgICBNZXJjaGFudCA9ICdNRVJDSEFOVCcsXG4gICAgVmVuZG9yID0gJ1ZFTkRPUidcbn1cblxuLyoqXG4gKiBGaXJlcyB3aGVuIGFuIGFjY291bnQgaXMgYXV0b21hdGljYWxseSB2ZXJpZmllZCB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlcyB3aGVuIGFuIGFjY291bnQgaGFzIGFuIGV4cGlyZWQgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgbWljcm8tZGVwb3NpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX0VYUElSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dGVybmFsIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaWNyby1kZXBvc2l0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5zaWdodHMgc3Vycm91bmRpbmcgZXh0ZXJuYWwgZmluYW5jaWFsIGluc3RpdHV0aW9uIGNvdW50ZXJwYXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlZCBhY2NvdW50cywgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIG5hdHVyZSBvZiB0cmFuc2ZlcnMgdG8vZnJvbSB0aGlzIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxEZXRlY3RlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZGV0ZWN0ZWRfYWNjb3VudHM6IEFycmF5PERldGVjdGVkQWNjb3VudD47XG59XG4vKipcbiAqIEZvcm0gMTA5OSBUeXBlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGb3JtMTA5OVR5cGUge1xuICAgIFVua25vd24gPSAnRk9STV8xMDk5X1RZUEVfVU5LTk9XTicsXG4gICAgTWlzYyA9ICdGT1JNXzEwOTlfVFlQRV9NSVNDJyxcbiAgICBLID0gJ0ZPUk1fMTA5OV9UWVBFX0snXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgdGhlIGZyYXVkIG9yIGF0dGVtcHRlZCBmcmF1ZC4gYGZyYXVkX2Ftb3VudGAgc2hvdWxkIGJlIG9taXR0ZWQgdG8gaW5kaWNhdGUgYW4gdW5rbm93biBmcmF1ZCBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZyYXVkQW1vdW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFtb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHZhbHVlLiBUaGlzIHZhbHVlIGNhbiBiZSAwIHRvIGluZGljYXRlIG5vIG1vbmV5IHdhcyBsb3N0LiBNdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiAoZS5nLiwgYDEuMjNgKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuYWx5emVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgR2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnM7XG59XG4vKipcbiAqIEEgc3RhdHVzIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoSW5jaWRlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBjYWxjdWxhdGVkIGhpc3RvcmljYWwgYmFsYW5jZSwgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZCBhbmQgUGxhaWQgaGFzIHByZXBhcmVkIGFzIG11Y2ggaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBkYXRhIGFzIHBvc3NpYmxlIGZvciB0aGUgSXRlbS4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgYmV5b25kIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gSWYgW0FjY291bnQgU2VsZWN0IHYyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvY3VzdG9taXphdGlvbi8jYWNjb3VudC1zZWxlY3QpIGlzIGVuYWJsZWQsIHRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgcHJpY2UgZ2l2ZW4gYnkgdGhlIGluc3RpdHV0aW9uIGZvciB0aGlzIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQsIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBob2xkaW5nLCBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNvc3QgYmFzaXMgb2YgdGhlIGhvbGRpbmcgKGUuZy4sIHRoZSB0b3RhbCBhbW91bnQgc3BlbnQgdG8gYWNxdWlyZSBhbGwgYXNzZXRzIGN1cnJlbnRseSBpbiB0aGUgaG9sZGluZykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGNvc3RfYmFzaXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgc2VjdXJpdHkgaXMgYW4gb3B0aW9uLCBgcXVhbnRpdHlgIHdpbGwgcmVmbGVjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG9wdGlvbnMgKHR5cGljYWxseSB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cyBtdWx0aXBsaWVkIGJ5IDEwMCksIG5vdCB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgaG9sZGluZ3MgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC4gVGhlIHdlYmhvb2sgdHlwaWNhbGx5IGZpcmVzIGluIHJlc3BvbnNlIHRvIGFueSBuZXdseSBhZGRlZCBob2xkaW5ncyBvciBwcmljZSBjaGFuZ2VzIHRvIGV4aXN0aW5nIGhvbGRpbmdzLCBtb3N0IGNvbW1vbmx5IGFmdGVyIG1hcmtldCBjbG9zZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBIT0xESU5HU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgaG9sZGluZ3MgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaG9sZGluZ3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVwZGF0ZWQgaG9sZGluZ3MgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1cGRhdGVkX2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGhvbGRpbmdzIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZyAoZS5nLiwgdGhlIHRvdGFsIGFtb3VudCBzcGVudCB0byBhY3F1aXJlIGFsbCBhc3NldHMgY3VycmVudGx5IGluIHRoZSBob2xkaW5nKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY29zdF9iYXNpcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk6IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEhvdyBQbGFpZCBzaG91bGQgZGVsaXZlciB0aGUgUGxhaWQgTGluayBzZXNzaW9uIHRvIHRoZSBjdXN0b21lci4gXFwnc21zXFwnIHdpbGwgZGVsaXZlciB2aWEgU01TLiBNdXN0IHBhc3MgYHVzZXIucGhvbmVfbnVtYmVyYC4gXFwnZW1haWxcXCcgd2lsbCBkZWxpdmVyIHZpYSBlbWFpbC4gTXVzdCBwYXNzIGB1c2VyLmVtYWlsX2FkZHJlc3NgLiBJbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGlnbm9yZWQ7IHVzZSB0aGUgUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0byB0ZXN0IEhvc3RlZCBMaW5rIHNlc3Npb24gZGVsaXZlcnkgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2Qge1xuICAgIFNtcyA9ICdzbXMnLFxuICAgIEVtYWlsID0gJ2VtYWlsJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGhvc3RlZCBzYW1lLWRheSBtaWNyb2RlcG9zaXRzIHZlcmlmaWNhdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBIT1NURURfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmluYWwgc3RhdHVzIG9mIHRoZSBzYW1lLWRheSBtaWNyb2RlcG9zaXRzIHZlcmlmaWNhdGlvbi4gV2lsbCBhbHdheXMgYmUgXFxcIk1BTlVBTExZX1ZFUklGSUVEXFxcIiBvciBcXFwiVkVSSUZJQ0FUSU9OX0ZBSUxFRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIG9mIHRoZSBhZmZlY3RlZCBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgZ2xvYmFsbHkgdW5pcXVlIGFuZCBodW1hbiByZWFkYWJsZSBJRCB0eXBlLCBzcGVjaWZpYyB0byB0aGUgY291bnRyeSBhbmQgZG9jdW1lbnQgY2F0ZWdvcnkuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtIeWJyaWQgSW5wdXQgVmFsaWRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSUROdW1iZXJUeXBlIHtcbiAgICBBckRuaSA9ICdhcl9kbmknLFxuICAgIEF1RHJpdmVyc0xpY2Vuc2UgPSAnYXVfZHJpdmVyc19saWNlbnNlJyxcbiAgICBBdVBhc3Nwb3J0ID0gJ2F1X3Bhc3Nwb3J0JyxcbiAgICBCckNwZiA9ICdicl9jcGYnLFxuICAgIENhU2luID0gJ2NhX3NpbicsXG4gICAgQ2xSdW4gPSAnY2xfcnVuJyxcbiAgICBDblJlc2lkZW50Q2FyZCA9ICdjbl9yZXNpZGVudF9jYXJkJyxcbiAgICBDb05pdCA9ICdjb19uaXQnLFxuICAgIERrQ3ByID0gJ2RrX2NwcicsXG4gICAgRWdOYXRpb25hbElkID0gJ2VnX25hdGlvbmFsX2lkJyxcbiAgICBFc0RuaSA9ICdlc19kbmknLFxuICAgIEVzTmllID0gJ2VzX25pZScsXG4gICAgSGtIa2lkID0gJ2hrX2hraWQnLFxuICAgIEluUGFuID0gJ2luX3BhbicsXG4gICAgSXRDZiA9ICdpdF9jZicsXG4gICAgSm9DaXZpbElkID0gJ2pvX2NpdmlsX2lkJyxcbiAgICBKcE15TnVtYmVyID0gJ2pwX215X251bWJlcicsXG4gICAgS2VIdWR1bWFOYW1iYSA9ICdrZV9odWR1bWFfbmFtYmEnLFxuICAgIEt3Q2l2aWxJZCA9ICdrd19jaXZpbF9pZCcsXG4gICAgTXhDdXJwID0gJ214X2N1cnAnLFxuICAgIE14UmZjID0gJ214X3JmYycsXG4gICAgTXlOcmljID0gJ215X25yaWMnLFxuICAgIE5nTmluID0gJ25nX25pbicsXG4gICAgTnpEcml2ZXJzTGljZW5zZSA9ICduel9kcml2ZXJzX2xpY2Vuc2UnLFxuICAgIE9tQ2l2aWxJZCA9ICdvbV9jaXZpbF9pZCcsXG4gICAgUGhQc24gPSAncGhfcHNuJyxcbiAgICBQbFBlc2VsID0gJ3BsX3Blc2VsJyxcbiAgICBSb0NucCA9ICdyb19jbnAnLFxuICAgIFNhTmF0aW9uYWxJZCA9ICdzYV9uYXRpb25hbF9pZCcsXG4gICAgU2VQaW4gPSAnc2VfcGluJyxcbiAgICBTZ05yaWMgPSAnc2dfbnJpYycsXG4gICAgVHJUY0tpbWxpayA9ICd0cl90Y19raW1saWsnLFxuICAgIFVzU3NuID0gJ3VzX3NzbicsXG4gICAgVXNTc25MYXN0NCA9ICd1c19zc25fbGFzdF80JyxcbiAgICBaYVNtYXJ0SWQgPSAnemFfc21hcnRfaWQnXG59XG5cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElTT0N1cnJlbmN5Q29kZSB7XG4gICAgVXNkID0gJ1VTRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgY2hhbmdlIHRvIGlkZW50aXR5IGRhdGEgaGFzIGJlZW4gZGV0ZWN0ZWQgb24gYW4gSXRlbS4gSXRlbXMgYXJlIGNoZWNrZWQgZm9yIGlkZW50aXR5IHVwZGF0ZXMgZXZlcnkgMzAtOTAgZGF5cy4gV2UgcmVjb21tZW5kIHRoYXQgdXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rIHlvdSBtYWtlIGFub3RoZXIgY2FsbCB0byBgL2lkZW50aXR5L2dldGAgdG8gZmV0Y2ggdGhlIHVzZXJcXCdzIGxhdGVzdCBpZGVudGl0eSBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBpZGVudGl0eSBhdHRyaWJ1dGVzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJQSE9ORVNcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9pZGVudGl0eTogeyBba2V5OiBzdHJpbmddOiBBcnJheTxJZGVudGl0eVVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRG9jdW1lbnQgb2JqZWN0IHdpdGggbWV0YWRhdGEgb2YgdGhlIGRvY3VtZW50IHVwbG9hZGVkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGRvY3VtZW50IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiAgYERPQ1VNRU5UX0VSUk9SYDogVGhlIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFBvc3NpYmxlIGNhdXNlcyBpbmNsdWRlOiBUaGUgZG9jdW1lbnQgd2FzIGFuIHVuYWNjZXB0YWJsZSBkb2N1bWVudCB0eXBlIHN1Y2ggYXMgYW4gb2ZmZXIgbGV0dGVyIG9yIGJhbmsgc3RhdGVtZW50LCB0aGUgZG9jdW1lbnQgaW1hZ2Ugd2FzIGNyb3BwZWQgb3IgYmx1cnJ5LCBvciB0aGUgZG9jdW1lbnQgd2FzIGNvcnJ1cHRlZC4gIGBVTktOT1dOYCBvciBgbnVsbGA6IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBJZiB0aGlzIGhhcHBlbnMgcmVwZWF0ZWRseSwgY29udGFjdCBzdXBwb3J0IG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdXBsb2FkZWRfYXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlcjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHk+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlNYXRjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aXR5TWF0Y2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBtYXRjaCBoYXMgYmVlbiByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZSwgcGhvbmUgbnVtYmVyLCBlbWFpbCBhZGRyZXNzIGFuZCBhZGRyZXNzIHVzZWQgdG8gcGVyZm9ybSBmdXp6eSBtYXRjaC4gSWYgRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgaXMgZW5hYmxlZCBpbiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QsIGxlYXZlIHRoaXMgZmllbGQgZW1wdHkgdG8gYXV0b21hdGljYWxseSBtYXRjaCBhZ2FpbnN0IFBJSSBjb2xsZWN0ZWQgZnJvbSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGNoZWNrcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZ1bGwgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGlkZW50aXR5IGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlVcGRhdGVUeXBlcyB7XG4gICAgUGhvbmVzID0gJ1BIT05FUycsXG4gICAgQWRkcmVzc2VzID0gJ0FERFJFU1NFUycsXG4gICAgRW1haWxzID0gJ0VNQUlMUycsXG4gICAgTmFtZXMgPSAnTkFNRVMnXG59XG5cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGF1dG9maWxsZWQsIHNvbWUgZmllbGRzIG1heSBiZSBudWxsIGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uXFwncyBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgQWRkcmVzc2VzIGZyb20gSG9uZyBLb25nIHdpbGwgbm90IGluY2x1ZGUgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBwb19ib3g6IFBPQm94U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzUHVycG9zZUxhYmVsfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHR5cGU6IEFkZHJlc3NQdXJwb3NlTGFiZWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBcXCcvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZVxcJ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHlvdSB3b3VsZCBsaWtlIFBsYWlkIHRvIGV4cG9zZSBhIHNoYXJlYWJsZSBVUkwgZm9yIHRoZSB2ZXJpZmljYXRpb24gYmVpbmcgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfc2hhcmVhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGFncmVlZCB0byBhIHByaXZhY3kgcG9saWN5IHNwZWNpZnlpbmcgdGhhdCB0aGVpciBkYXRhIHdpbGwgYmUgc2hhcmVkIHdpdGggUGxhaWQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIElmIGBnYXZlX2NvbnNlbnRgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCB3aWxsIGJlIG1hcmtlZCBhcyBgc2tpcHBlZGAgYW5kIHRoZSBlbmQgdXNlclxcJ3Mgc2Vzc2lvbiB3aWxsIHN0YXJ0IGF0IHRoZSBuZXh0IHN0ZXAgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGdhdmVfY29uc2VudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZmxhZyBzcGVjaWZ5aW5nIGhvdyB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBoYW5kbGUgYXR0ZW1wdHMgdG8gY3JlYXRlIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aGVuIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHByb3ZpZGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGlkZW1wb3RlbmN5IGlzIGVuYWJsZWQsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBleGlzdGluZyBJZGVudGl0eSBWZXJpZmljYXRpb24uIElmIGlkZW1wb3RlbmN5IGlzIGRpc2FibGVkLCBQbGFpZCB3aWxsIHJlamVjdCB0aGUgcmVxdWVzdCB3aXRoIGEgYDQwMCBCYWQgUmVxdWVzdGAgc3RhdHVzIGNvZGUgaWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGZvciB0aGUgc3VwcGxpZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfaWRlbXBvdGVudD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VyIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBvdXRzaWRlIG9mIExpbmssIG1vc3QgbGlrZWx5IHZpYSB5b3VyIG93biBvbmJvYXJkaW5nIHByb2Nlc3MuICBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpdHkgZmllbGRzIGFyZSBvcHRpb25hbDogIGBlbWFpbF9hZGRyZXNzYCAgYHBob25lX251bWJlcmAgIGBkYXRlX29mX2JpcnRoYCAgYG5hbWVgICBgYWRkcmVzc2AgIGBpZF9udW1iZXJgICBTcGVjaWZpY2FsbHksIHRoZXNlIGZpZWxkcyBhcmUgb3B0aW9uYWwgaW4gdGhhdCB0aGV5IGNhbiBlaXRoZXIgYmUgZnVsbHkgcHJvdmlkZWQgKHNhdGlzZnlpbmcgZXZlcnkgcmVxdWlyZWQgZmllbGQgaW4gdGhlaXIgc3Vic2NoZW1hKSBvciBvbWl0dGVkIGZyb20gdGhlIHJlcXVlc3QgZW50aXJlbHkgYnkgbm90IHByb3ZpZGluZyB0aGUga2V5IG9yIHZhbHVlLiBQcm92aWRpbmcgdGhlc2UgZmllbGRzIHZpYSB0aGUgQVBJIHdpbGwgcmVzdWx0IGluIExpbmsgc2tpcHBpbmcgdGhlIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzIGZvciB0aGUgYXNzb2NpYXRlZCB1c2VyLiBBbGwgdmVyaWZpY2F0aW9uIHN0ZXBzIGVuYWJsZWQgaW4gdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFRlbXBsYXRlIHdpbGwgc3RpbGwgYmUgcnVuLiBWZXJpZmljYXRpb24gc3RlcHMgd2lsbCBlaXRoZXIgYmUgcnVuIGltbWVkaWF0ZWx5LCBvciBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgYGFjY2VwdF90b3NgIHN0ZXAsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgcHJvdmlkZWQgdG8gdGhlIGBnYXZlX2NvbnNlbnRgIGZpZWxkLiBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgc2hhcmVhYmxlIFVSTCBmZWF0dXJlLCB5b3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSB0aGVzZSBmaWVsZHMgdmlhIGAvbGluay90b2tlbi9jcmVhdGVgIGluc3RlYWQ7IGJvdGggYC9pZGVudGl0eV92ZXJpZmljYXRpb24vY3JlYXRlYCBhbmQgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYXJlIHZhbGlkIHdheXMgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgaWYgeW91IHByb3ZpZGUgYSBub24tYG51bGxgIHVzZXIgZGF0YSBvYmplY3QgdmlhIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAsIGFueSB1c2VyIGRhdGEgZmllbGRzIGVudGVyZWQgdmlhIGAvbGluay90b2tlbi9jcmVhdGVgIGZvciB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgIHdpbGwgYmUgaWdub3JlZCB3aGVuIHByZWZpbGxpbmcgTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlciB7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHVzZXIuY2xpZW50X3VzZXJfaWRgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBjbGllbnRfdXNlcl9pZGAgYXQgdGhlIHJvb3QgbGV2ZWwgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gVGhlIGFkZHJlc3MgbXVzdCBhdCBsZWFzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgZmllbGRzIHRvIGJlIGEgdmFsaWQgYWRkcmVzczogYHN0cmVldGAsIGBjaXR5YCwgYGNvdW50cnlgLiBJZiBhbnkgYXJlIG1pc3Npbmcgb3IgdW5hYmxlIHRvIGJlIGV4dHJhY3RlZCwgdGhlIGFkZHJlc3Mgd2lsbCBiZSBudWxsLiAgYHJlZ2lvbmAsIGFuZCBgcG9zdGFsX2NvZGVgIG1heSBiZSBudWxsIGJhc2VkIG9uIHRoZSBhZGRyZXNzaW5nIHN5c3RlbS4gRm9yIGV4YW1wbGU6ICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgQWRkcmVzc2VzIGZyb20gSG9uZyBLb25nIHdpbGwgbm90IGluY2x1ZGUgcG9zdGFsIGNvZGUgIE5vdGU6IE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uIChPQ1IpIHRlY2hub2xvZ3kgbWF5IHNvbWV0aW1lcyBleHRyYWN0IGluY29ycmVjdCBkYXRhIGZyb20gYSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2l0eSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBQbGFpZCBzZXNzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBzZXNzaW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxJZGVudGl0eVZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczogQXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogWW91IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBwcmUtcG9wdWxhdGUgdGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWU7IGlmIGl0IGlzIHByb3ZpZGVkIGhlcmUsIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBwcm92aWRlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhlaXIgbmFtZSwgdGhpcyBmaWVsZCB3aWxsIGJlIG51bGwuIE90aGVyd2lzZSwgYm90aCBmaWVsZHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gcmV0cmllZCwgd2hpY2ggY2FuIGJlIHRyaWdnZXJlZCB2aWEgdGhlIGRhc2hib2FyZCBvciB0aGUgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFVFJJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJpZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHJldHJ5aW5nIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RyYXRlZ3l9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc3RyYXRlZ3k6IFN0cmF0ZWd5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGVwcz86IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0cnVjdGlvbnMgZm9yIHRoZSBgY3VzdG9tYCByZXRyeSBzdHJhdGVneSBzcGVjaWZ5aW5nIHdoaWNoIHN0ZXBzIHNob3VsZCBiZSByZXF1aXJlZCBvciBza2lwcGVkLiAgIE5vdGU6ICAgVGhpcyBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gdGhlIHJldHJ5IHN0cmF0ZWd5IGlzIGBjdXN0b21gIGFuZCBtdXN0IGJlIG9taXR0ZWQgb3RoZXJ3aXNlLiAgQ3VzdG9tIHJldHJpZXMgb3ZlcnJpZGUgc2V0dGluZ3MgaW4geW91ciBQbGFpZCBUZW1wbGF0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgUGxhaWQgVGVtcGxhdGUgaGFzIGB2ZXJpZnlfc21zYCBkaXNhYmxlZCwgYSBjdXN0b20gcmV0cnkgd2l0aCBgdmVyaWZ5X3Ntc2AgZW5hYmxlZCB3aWxsIHN0aWxsIHJlcXVpcmUgdGhlIHN0ZXAuICBUaGUgYHNlbGZpZV9jaGVja2Agc3RlcCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiB0aGUgc2FuZGJveCBzZXJ2ZXIuIFNhbmRib3ggcmVxdWVzdHMgd2lsbCBzaWxlbnRseSBkaXNhYmxlIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIHdoZW4gcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGB2ZXJpZnlfc21zYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBga3ljX2NoZWNrYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoaXMgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuICAgYGFjdGl2ZWAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaXMgaW5jb21wbGV0ZS4gVGhlIHVzZXIgbWF5IGhhdmUgY29tcGxldGVkIHBhcnQgb2YgdGhlIHNlc3Npb24sIGJ1dCBoYXMgbmVpdGhlciBmYWlsZWQgb3IgcGFzc2VkLiAgYHN1Y2Nlc3NgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGhhcyBjb21wbGV0ZWQsIHBhc3NpbmcgYWxsIHN0ZXBzIGRlZmluZWQgdG8gdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHRlbXBsYXRlICBgZmFpbGVkYCAtIFRoZSB1c2VyIGZhaWxlZCBvbmUgb3IgbW9yZSBzdGVwcyBpbiB0aGUgc2Vzc2lvbiBhbmQgd2FzIHRvbGQgdG8gY29udGFjdCBzdXBwb3J0LiAgYGV4cGlyZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBhY3RpdmUgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSB3aXRob3V0IGJlaW5nIGNvbXBsZXRlZCBhbmQgd2FzIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIGV4cGlyZWQuIE5vdGUgdGhhdCBzZXNzaW9ucyBjdXJyZW50bHkgZG8gbm90IGV4cGlyZS4gQXV0b21hdGljIGV4cGlyYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgZW5hYmxlZCBpbiB0aGUgZnV0dXJlLiAgYGNhbmNlbGVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgY2FuY2VsZWQsIGVpdGhlciB2aWEgdGhlIGRhc2hib2FyZCBieSBhIHVzZXIsIG9yIHZpYSBBUEkuIFRoZSB1c2VyIG1heSBoYXZlIGNvbXBsZXRlZCBwYXJ0IG9mIHRoZSBzZXNzaW9uLCBidXQgaGFzIG5laXRoZXIgZmFpbGVkIG9yIHBhc3NlZC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJyxcbiAgICBDYW5jZWxlZCA9ICdjYW5jZWxlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3Jldmlldydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN0ZXAgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFdhaXRpbmdGb3JQcmVyZXF1aXNpdGUgPSAnd2FpdGluZ19mb3JfcHJlcmVxdWlzaXRlJyxcbiAgICBOb3RBcHBsaWNhYmxlID0gJ25vdF9hcHBsaWNhYmxlJyxcbiAgICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnLFxuICAgIE1hbnVhbGx5UmVqZWN0ZWQgPSAnbWFudWFsbHlfcmVqZWN0ZWQnXG59XG5cbi8qKlxuICogRWFjaCBzdGVwIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgIGBhY3RpdmVgIC0gVGhpcyBzdGVwIGlzIHRoZSB1c2VyXFwncyBjdXJyZW50IHN0ZXAuIFRoZXkgYXJlIGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBjb21wbGV0aW5nIHRoaXMgc3RlcCwgb3IgdGhleSByZWNlbnRseSBjbG9zZWQgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHN0ZXAuIE9ubHkgb25lIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYGFjdGl2ZWAgYXQgYW55IGdpdmVuIHBvaW50LiAgYHN1Y2Nlc3NgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGhhcyBjb21wbGV0ZWQgdGhpcyBzdGVwLiAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgdGhpcyBzdGVwLiBUaGlzIGNhbiBlaXRoZXIgY2FsbCB0aGUgdXNlciB0byBmYWlsIHRoZSBzZXNzaW9uIGFzIGEgd2hvbGUsIG9yIGNhdXNlIHRoZW0gdG8gZmFsbGJhY2sgdG8gYW5vdGhlciBzdGVwIGRlcGVuZGluZyBvbiBob3cgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSBpcyBjb25maWd1cmVkLiBBIGZhaWxlZCBzdGVwIGRvZXMgbm90IGltcGx5IGEgZmFpbGVkIHNlc3Npb24uICBgd2FpdGluZ19mb3JfcHJlcmVxdWlzaXRlYCAtIFRoZSB1c2VyIG5lZWRzIHRvIGNvbXBsZXRlIGFub3RoZXIgc3RlcCBmaXJzdCwgYmVmb3JlIHRoZXkgcHJvZ3Jlc3MgdG8gdGhpcyBzdGVwLiBUaGlzIHN0ZXAgbWF5IG5ldmVyIHJ1biwgZGVwZW5kaW5nIG9uIGlmIHRoZSB1c2VyIGZhaWxzIGFuIGVhcmxpZXIgc3RlcCBvciBpZiB0aGUgc3RlcCBpcyBvbmx5IHJ1biBhcyBhIGZhbGxiYWNrLiAgYG5vdF9hcHBsaWNhYmxlYCAtIFRoaXMgc3RlcCB3aWxsIG5vdCBiZSBydW4gZm9yIHRoaXMgc2Vzc2lvbi4gIGBza2lwcGVkYCAtIFRoZSByZXRyeSBpbnN0cnVjdGlvbnMgdGhhdCBjcmVhdGVkIHRoaXMgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgc3BlY2lmaWVkIHRoYXQgdGhpcyBzdGVwIHNob3VsZCBiZSBza2lwcGVkLiAgYGV4cGlyZWRgIC0gVGhpcyBzdGVwIGhhZCBub3QgeWV0IGJlZW4gY29tcGxldGVkIHdoZW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGFzIGEgd2hvbGUgZXhwaXJlZC4gIGBjYW5jZWxlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGVkIGJlZm9yZSB0aGUgdXNlciBjb21wbGV0ZWQgdGhpcyBzdGVwLiAgYHBlbmRpbmdfcmV2aWV3YCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB0ZW1wbGF0ZSB3YXMgY29uZmlndXJlZCB0byBwZXJmb3JtIGEgc2NyZWVuaW5nIHRoYXQgaGFkIG9uZSBvciBtb3JlIGhpdHMgbmVlZGluZyByZXZpZXcuICBgbWFudWFsbHlfYXBwcm92ZWRgIC0gVGhlIHN0ZXAgd2FzIG1hbnVhbGx5IG92ZXJyaWRkZW4gdG8gcGFzcyBieSBhIHRlYW0gbWVtYmVyIGluIHRoZSBkYXNoYm9hcmQuICBgbWFudWFsbHlfcmVqZWN0ZWRgIC0gVGhlIHN0ZXAgd2FzIG1hbnVhbGx5IG92ZXJyaWRkZW4gdG8gZmFpbCBieSBhIHRlYW0gbWVtYmVyIGluIHRoZSBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgYWNjZXB0X3RvczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmc6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyBjb21wbGV0ZWQgYSBzdGVwIG9mIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElERU5USVRZX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEVQX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSByZXNvdXJjZSBJRCBhbmQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHRlbXBsYXRlIGNvbmZpZ3VyaW5nIHRoZSBiZWhhdmlvciBvZiBhIGdpdmVuIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gY29sbGVjdGVkLCBzb21lIGZpZWxkcyBtYXkgYmUgbnVsbCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvblxcJ3MgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZGF0YSB0aGF0IHdhcyBlaXRoZXIgY29sbGVjdGVkIGZyb20gdGhlIHVzZXIgb3IgcHJvdmlkZWQgdmlhIEFQSSBpbiBvcmRlciB0byBwZXJmb3JtIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBoaWdoIGxldmVsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGUgdXNlciBzdWJtaXR0ZWQuICBGb3IgZXhhbXBsZSwgYW4gaW1hZ2UgdGhhdCBpcyBibHVycnksIGRpc3RvcnRlZCBieSBnbGFyZSBmcm9tIGEgbmVhcmJ5IGxpZ2h0IHNvdXJjZSwgb3IgaW1wcm9wZXJseSBmcmFtZWQgbWlnaHQgYmUgbWFya2VkIGFzIGxvdyBvciBtZWRpdW0gcXVhbGl0eS4gUG9vciBxdWFsaXR5IGltYWdlcyBhcmUgbW9yZSBsaWtlbHkgdG8gZmFpbCBPQ1IgYW5kL29yIHRlbXBsYXRlIGNvbmZvcm1pdHkgY2hlY2tzLiAgTm90ZTogQnkgZGVmYXVsdCwgUGxhaWQgd2lsbCBsZXQgYSB1c2VyIHJlY2FwdHVyZSBkb2N1bWVudCBpbWFnZXMgdHdpY2UgYmVmb3JlIGZhaWxpbmcgdGhlIGVudGlyZSBzZXNzaW9uIGlmIHdlIGF0dHJpYnV0ZSB0aGUgZmFpbHVyZSB0byBsb3cgaW1hZ2UgcXVhbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eSB7XG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBMb3cgPSAnbG93J1xufVxuXG4vKipcbiAqIEFuIHVwZGF0ZSBvbiB0aGUgaGVhbHRoIGluY2lkZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEluY2lkZW50VXBkYXRlU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSB1cGRhdGUgd2FzIHB1Ymxpc2hlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZT86IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW0ge1xuICAgIEludmVzdGlnYXRpbmcgPSAnSU5WRVNUSUdBVElORycsXG4gICAgSWRlbnRpZmllZCA9ICdJREVOVElGSUVEJyxcbiAgICBTY2hlZHVsZWQgPSAnU0NIRURVTEVEJyxcbiAgICBSZXNvbHZlZCA9ICdSRVNPTFZFRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBicmVha2Rvd24gb2YgdGhlIGRpZmZlcmVudCBpbmNvbWUgdHlwZXMgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZUJyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZUJyZWFrZG93blR5cGV9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU6IEluY29tZUJyZWFrZG93blR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBob3VybHkgcmF0ZSBhdCB3aGljaCB0aGUgaW5jb21lIGlzIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGhvdXJzIGxvZ2dlZCBmb3IgdGhpcyBpbmNvbWUgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcGF5IGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGluY29tZS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICAgYFxcXCJyZWd1bGFyXFxcImA6IHJlZ3VsYXIgaW5jb21lICAgYFxcXCJvdmVydGltZVxcXCJgOiBvdmVydGltZSBpbmNvbWUgICBgXFxcImJvbnVzXFxcImA6IGJvbnVzIGluY29tZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lQnJlYWtkb3duVHlwZSB7XG4gICAgQm9udXMgPSAnYm9udXMnLFxuICAgIE92ZXJ0aW1lID0gJ292ZXJ0aW1lJyxcbiAgICBSZWd1bGFyID0gJ3JlZ3VsYXInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IHBheXJvbGwgZGF0YSBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGF5c3R1YnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVPdmVycmlkZVxuICAgICAqL1xuICAgIHBheXN0dWJzPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlPjtcbn1cbi8qKlxuICogVGhlIHZlcmlmaWVkIGZpZWxkcyBmcm9tIGEgcGF5c3R1YiB2ZXJpZmljYXRpb24uIEFsbCBmaWVsZHMgYXJlIHByb3ZpZGVkIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZTogRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZWVfbmFtZTogRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX2dyb3NzX2luY29tZTogWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9uZXRfaW5jb21lOiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IFBheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHByb2plY3RlZF93YWdlOiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmaWVkX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaWVsZCBudW1iZXIgZm9yIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBlbmRwb2ludCB0byB3aGljaCBQbGFpZCBzaG91bGQgc2VuZCB3ZWJob29rcyByZWxhdGVkIHRvIHRoZSBwcm9ncmVzcyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcHJlY2hlY2sgY3JlYXRlZCB3aXRoIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuIFdpbGwgYmUgdXNlZCB0byBpbXByb3ZlIGNvbnZlcnNpb24gb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJlY2hlY2tfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBPcHRpb25hbCBhcmd1bWVudHMgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBJdGVtcyB0aGF0IHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZSBwcm9kdWN0IGRhdGEuIFBsYWlkIHdpbGwgYXR0ZW1wdCB0byBjb3JyZWxhdGUgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIHRoZXNlIEl0ZW1zIHdpdGggZGF0YSBmcm9tIHRoZSB1c2VyXFwncyBwYXlzdHViLCBzdWNoIGFzIGRhdGUgYW5kIGFtb3VudC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIHByb2R1Y3Qgd2FzIG5vdCBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBMaW5rLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIHRoaXMgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHlzaXMgb3B0aW9ucyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHBhcnNpbmdcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWcge1xuICAgIE9jciA9ICdvY3InLFxuICAgIEZyYXVkUmlzayA9ICdmcmF1ZF9yaXNrJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvY3VtZW50IElEIHRvIGRvd25sb2FkLiBJZiBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdGluZyB6aXAgZmlsZSwgcmF0aGVyIHRoYW4gYWxsIGRvY3VtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGbG93IHR5cGVzIHRvIHJldHJpZXZlIHBheXJvbGwgaW5jb21lIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxGbG93VHlwZSB7XG4gICAgRGlnaXRhbEluY29tZSA9ICdwYXlyb2xsX2RpZ2l0YWxfaW5jb21lJyxcbiAgICBEb2N1bWVudEluY29tZSA9ICdwYXlyb2xsX2RvY3VtZW50X2luY29tZSdcbn1cblxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbiBmb3Igd2hpY2ggdG8gZ2V0IHBheXN0dWIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgZm9yIGFuIGluY29tZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YT86IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheXN0dWJzOiBBcnJheTxQYXlzdHViPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb25maWRlbmNlIHRoYXQgUGxhaWQgY2FuIHN1cHBvcnQgdGhlIHVzZXIgaW4gdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93IGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgbWFudWFsIHBheXN0dWIgdXBsb2FkLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiSElHSFxcXCJgOiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHRoaXMgdXNlciBjYW4gdXNlIHRoZSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gIFxcXCJgTE9XYFxcXCI6IEl0IGlzIHVubGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgYFxcXCJVTktOT1dOXFxcImA6IEl0IHdhcyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSB1c2VyIGlzIHN1cHBvcnRhYmxlIHdpdGggdGhlIGluZm9ybWF0aW9uIHBhc3NlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBMb3cgPSAnTE9XJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBlbXBsb3llclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIHRheCBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICB0YXhfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBlbXBsb3llclxcJ3MgcHVibGljIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCBtaWxpdGFyeSBpbmZvIGluIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByZWNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8ge1xuICAgIC8qKlxuICAgICAqIElzIHRoZSB1c2VyIGN1cnJlbnRseSBhY3RpdmUgZHV0eSBpbiB0aGUgVVMgbWlsaXRhcnlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAgICAgKi9cbiAgICBpc19hY3RpdmVfZHV0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZXJ2aW5nIGluIHRoZSBVUyBtaWxpdGFyeSwgdGhlIGJyYW5jaCBvZiB0aGUgbWlsaXRhcnkgaW4gd2hpY2ggdGhleSBhcmUgc2VydmluZyBWYWxpZCB2YWx1ZXM6IFxcJ0FJUiBGT1JDRVxcJywgXFwnQVJNWVxcJywgXFwnQ09BU1QgR1VBUkRcXCcsIFxcJ01BUklORVNcXCcsIFxcJ05BVllcXCcsIFxcJ1VOS05PV05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGJyYW5jaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlclxcJ3MgcGF5cm9sbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHBheXJvbGwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luc3RpdHV0aW9uPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gSXRlbXMgYmVsb25naW5nIHRvIHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGNoZWNrZWQuIE5vdGUgdGhhdCBpZiB0aGUgSXRlbXMgc3BlY2lmaWVkIGhlcmUgYXJlIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIHByb3ZpZGluZyB0aGVtIGluIHRoaXMgZmllbGQgd2lsbCBjYXVzZSB0aGVzZSBJdGVtcyB0byBiZSBpbml0aWFsaXplZCB3aXRoIChhbmQgYmlsbGVkIGZvcikgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c19taWxpdGFyeV9pbmZvPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8gfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwcmVjaGVjay4gUHJvdmlkZSB0aGlzIHZhbHVlIHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbiBvcmRlciB0byBvcHRpbWl6ZSBMaW5rIGNvbnZlcnNpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2U6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrQ29uZmlkZW5jZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgZXZhbHVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgaG9tZV9hZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBhdHRlbXB0IHRvIHJlZnJlc2ggUGF5cm9sbCBJbmNvbWUgZGF0YSBmb3IgYSB1c2VyIHZpYSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCBmYWlsZWQgYmVjYXVzZSB0aGUgdXNlciBtdXN0IHJlLWNvbm5lY3QgdGhlaXIgcGF5cm9sbCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUkVGUkVTSF9SRUNPTk5FQ1RfTkVFREVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHJpc2sgc2lnbmFscyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBkb2N1bWVudHMgdXBsb2FkZWQgdmlhIERvY3VtZW50IEluY29tZS4gSXQgd2lsbCB0eXBpY2FsbHkgdGFrZSBhIG1pbnV0ZSBvciB0d28gZm9yIHRoaXMgd2ViaG9vayB0byBmaXJlIGFmdGVyIHRoZSBlbmQgdXNlciBoYXMgdXBsb2FkZWQgdGhlaXIgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBtYXkgdGhlbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgYW5kIHRvIHJldHJpZXZlIHJpc2sgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHVzZXJfaWRgIG9mIHRoZSBVc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJJU0tfU0lHTkFMU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGluY29tZSB2ZXJpZmljYXRpb24gZnJhdWQgZGV0ZWN0aW9uIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gSWYgdGhlIHVzZXIgdXBsb2FkZWQgbXVsdGlwbGUgZG9jdW1lbnRzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIHdoZW4gYWxsIGRvY3VtZW50cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIENhbGwgdGhlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGVuZHBvaW50IHRvIGdldCBhbGwgcmlzayBzaWduYWwgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHNfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBzaGFyZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZSB7XG4gICAgQmFuayA9ICdiYW5rJyxcbiAgICBQYXlyb2xsID0gJ3BheXJvbGwnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2UgaGFzIGNoYW5nZWQuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZvcm1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUYXhmb3JtPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRheGZvcm1zOiBBcnJheTxUYXhmb3JtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIFN0YXR1cyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGFyZW50IGNvbnRhaW5lciBmb3IgbmFtZSB0aGF0IGFsbG93cyBmb3IgY2hvaWNlIGdyb3VwIGJldHdlZW4gcGFyc2VkIGFuZCB1bnBhcnNlZCBjb250YWluZXJzLlBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbE5hbWVcbiAgICAgKi9cbiAgICBGaXJzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogTmFtZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCwgaW5jbHVkaW5nIGFsbCBwYXJ0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBuYW1lcyBhcmUgdGhvc2UgbW9zdCBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgcGVyc29uLiBPbmx5IG9uZSBuYW1lIHdpbGwgZXZlciBiZSBtYXJrZWQgYXMgcHJpbWFyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2Vha0FsaWFzRGV0ZXJtaW5hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBTaG9ydGhhbmQgaWRlbnRpZmllciBmb3IgYSBzcGVjaWZpYyBzY3JlZW5pbmcgbGlzdCBmb3IgaW5kaXZpZHVhbHMuICBgQVVfQ09OYDogQXVzdHJhbGlhIERlcGFydG1lbnQgb2YgRm9yZWlnbiBBZmZhaXJzIGFuZCBUcmFkZSBDb25zb2xpZGF0ZWQgTGlzdCAgYENBX0NPTmA6IEdvdmVybm1lbnQgb2YgQ2FuYWRhIENvbnNvbGlkYXRlZCBMaXN0IG9mIFNhbmN0aW9ucyAgYEVVX0NPTmA6IEV1cm9wZWFuIEV4dGVybmFsIEFjdGlvbiBTZXJ2aWNlIENvbnNvbGlkYXRlZCBMaXN0ICBgSVpfQ0lBYDogQ0lBIExpc3Qgb2YgQ2hpZWZzIG9mIFN0YXRlIGFuZCBDYWJpbmV0IE1lbWJlcnMgIGBJWl9JUExgOiBJbnRlcnBvbCBSZWQgTm90aWNlcyBmb3IgV2FudGVkIFBlcnNvbnMgTGlzdCAgYElaX1BFUGA6IFBvbGl0aWNhbGx5IEV4cG9zZWQgUGVyc29ucyBMaXN0ICBgSVpfVU5DYDogVW5pdGVkIE5hdGlvbnMgQ29uc29saWRhdGVkIFNhbmN0aW9ucyAgYElaX1dCS2A6IFdvcmxkIEJhbmsgTGlzdGluZyBvZiBJbmVsaWdpYmxlIEZpcm1zIGFuZCBJbmRpdmlkdWFscyAgYFVLX0hNQ2A6IFVLIEhNIFRyZWFzdXJ5IENvbnNvbGlkYXRlZCBMaXN0ICBgVVNfRFBMYDogQnVyZWF1IG9mIEluZHVzdHJ5IGFuZCBTZWN1cml0eSBEZW5pZWQgUGVyc29ucyBMaXN0ICBgVVNfRFRDYDogVVMgRGVwYXJ0bWVudCBvZiBTdGF0ZSBBRUNBIERlYmFycmVkICBgVVNfRkJJYDogVVMgRGVwYXJ0bWVudCBvZiBKdXN0aWNlIEZCSSBXYW50ZWQgTGlzdCAgYFVTX0ZTRWA6IFVTIE9GQUMgRm9yZWlnbiBTYW5jdGlvbnMgRXZhZGVycyAgYFVTX0lTTmA6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgTm9ucHJvbGlmZXJhdGlvbiBTYW5jdGlvbnMgIGBVU19QTENgOiBVUyBPRkFDIFBhbGVzdGluaWFuIExlZ2lzbGF0aXZlIENvdW5jaWwgIGBVU19TRE5gOiBVUyBPRkFDIFNwZWNpYWxseSBEZXNpZ25hdGVkIE5hdGlvbmFscyBMaXN0ICBgVVNfU1NJYDogVVMgT0ZBQyBTZWN0b3JhbCBTYW5jdGlvbnMgSWRlbnRpZmljYXRpb25zICBgU0dfU09GYDogR292ZXJubWVudCBvZiBTaW5nYXBvcmUgVGVycm9yaXN0cyBhbmQgVGVycm9yaXN0IEVudGl0aWVzICBgVFJfVFdMYDogR292ZXJubWVudCBvZiBUdXJrZXkgVGVycm9yaXN0IFdhbnRlZCBMaXN0ICBgVFJfREZEYDogR292ZXJubWVudCBvZiBUdXJrZXkgRG9tZXN0aWMgRnJlZXppbmcgRGVjaXNpb25zICBgVFJfRk9SYDogR292ZXJubWVudCBvZiBUdXJrZXkgRm9yZWlnbiBGcmVlemluZyBSZXF1ZXN0cyAgYFRSX1dNRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFdlYXBvbnMgb2YgTWFzcyBEZXN0cnVjdGlvbiAgYFRSX0NNQmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IENhcGl0YWwgTWFya2V0cyBCb2FyZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5kaXZpZHVhbFdhdGNobGlzdENvZGUge1xuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgQ2FDb24gPSAnQ0FfQ09OJyxcbiAgICBFdUNvbiA9ICdFVV9DT04nLFxuICAgIEl6Q2lhID0gJ0laX0NJQScsXG4gICAgSXpJcGwgPSAnSVpfSVBMJyxcbiAgICBJelBlcCA9ICdJWl9QRVAnLFxuICAgIEl6VW5jID0gJ0laX1VOQycsXG4gICAgSXpXYmsgPSAnSVpfV0JLJyxcbiAgICBVa0htYyA9ICdVS19ITUMnLFxuICAgIFVzRHBsID0gJ1VTX0RQTCcsXG4gICAgVXNEdGMgPSAnVVNfRFRDJyxcbiAgICBVc0ZiaSA9ICdVU19GQkknLFxuICAgIFVzRnNlID0gJ1VTX0ZTRScsXG4gICAgVXNJc24gPSAnVVNfSVNOJyxcbiAgICBVc01icyA9ICdVU19NQlMnLFxuICAgIFVzUGxjID0gJ1VTX1BMQycsXG4gICAgVXNTZG4gPSAnVVNfU0ROJyxcbiAgICBVc1NzaSA9ICdVU19TU0knLFxuICAgIFNnU29mID0gJ1NHX1NPRicsXG4gICAgVHJUd2wgPSAnVFJfVFdMJyxcbiAgICBUckRmZCA9ICdUUl9ERkQnLFxuICAgIFRyRm9yID0gJ1RSX0ZPUicsXG4gICAgVHJXbWQgPSAnVFJfV01EJyxcbiAgICBUckNtYiA9ICdUUl9DTUInXG59XG5cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBpbmRpdmlkdWFscy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIEluZGl2aWR1YWxzXFxcIiwgXFxcIlVTIENhcmRob2xkZXJzXFxcIiwgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBgaW5mbG93X21vZGVsYCBhbGxvd3MgeW91IHRvIG1vZGVsIGEgdGVzdCBhY2NvdW50IHRoYXQgcmVjZWl2ZXMgcmVndWxhciBpbmNvbWUgb3IgbWFrZSByZWd1bGFyIHBheW1lbnRzIG9uIGEgbG9hbi4gQW55IHRyYW5zYWN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIGBpbmZsb3dfbW9kZWxgIHdpbGwgYXBwZWFyIGluIGFkZGl0aW9uIHRvIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0IGRhdGEgb3IgdHJhbnNhY3Rpb25zIHNwZWNpZmllZCBieSBgb3ZlcnJpZGVfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmZsb3dNb2RlbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5mbG93TW9kZWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbmZsb3cgbW9kZWwuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYG5vbmVgOiBObyBpbmNvbWUgIGBtb250aGx5LWluY29tZWA6IEluY29tZSBvY2N1cnMgb25jZSBwZXIgbW9udGggYG1vbnRobHktYmFsYW5jZS1wYXltZW50YDogUGF5cyBvZmYgdGhlIGJhbGFuY2Ugb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGA6IE1ha2VzIGFuIGludGVyZXN0LW9ubHkgcGF5bWVudCBvbiBhIGxpYWJpbGl0eSBhY2NvdW50IGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnQgZGF5IG9mIG1vbnRoLiAgTm90ZSB0aGF0IGFjY291bnQgdHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzIHdpbGwgYWNjcnVlIGludGVyZXN0IGluIHRoZSBTYW5kYm94LiBUaGUgdHlwZXMgaW1wYWN0ZWQgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIHN1YnR5cGUgYGNyZWRpdGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgaW5jb21lIHBlciBtb250aC4gVGhpcyB2YWx1ZSBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIGluY29tZV9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgYmV0d2VlbiAxIGFuZCAyOCwgb3IgYGxhc3RgIG1lYW5pbmcgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggdGhlIGluY29tZSB0cmFuc2FjdGlvbiB3aWxsIGFwcGVhci4gVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgcGF5bWVudF9kYXlfb2ZfbW9udGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBiYWxhbmNlIGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9kYXlfb2ZfbW9udGg6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBpbml0aWFsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBJZiBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkgaXMgZW5hYmxlZCwgdGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldywgdW5mZXRjaGVkIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGV0YWlscyByZWxhdGluZyB0byBhIHNwZWNpZmljIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGluc3RpdHV0aW9uLiBOb3RlIHRoYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gbWF5IGhhdmUgbXVsdGlwbGUgcmVjb3JkcywgZWFjaCB3aXRoIGRpZmZlcmVudCBpbnN0aXR1dGlvbiBJRHM7IGZvciBleGFtcGxlLCBpZiB0aGUgaW5zdGl0dXRpb24gaGFzIG1pZ3JhdGVkIHRvIE9BdXRoLCB0aGVyZSBtYXkgYmUgc2VwYXJhdGUgYGluc3RpdHV0aW9uX2lkYHMgZm9yIHRoZSBPQXV0aCBhbmQgbm9uLU9BdXRoIHZlcnNpb25zIG9mIHRoZSBpbnN0aXR1dGlvbi4gSW5zdGl0dXRpb25zIHRoYXQgb3BlcmF0ZSBpbiBkaWZmZXJlbnQgY291bnRyaWVzIG9yIHdpdGggbXVsdGlwbGUgbG9naW4gcG9ydGFscyBtYXkgYWxzbyBoYXZlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciBlYWNoIGNvdW50cnkgb3IgcG9ydGFsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBQbGFpZCBwcm9kdWN0cyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBOb3RlIHRoYXQgb25seSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IEluc3RhbnQgQXV0aCB3aWxsIHJldHVybiBgYXV0aGAgaW4gdGhlIHByb2R1Y3QgYXJyYXk7IGluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBsaXN0IGBhdXRoYCBtYXkgc3RpbGwgc3VwcG9ydCBvdGhlciBBdXRoIG1ldGhvZHMgc3VjaCBhcyBJbnN0YW50IE1hdGNoIG9yIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IFZlcmlmaWNhdGlvbi4gVG8gaWRlbnRpZnkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCB0aG9zZSBtZXRob2RzLCB1c2UgdGhlIGBhdXRoX21ldGFkYXRhYCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbRnVsbCBBdXRoIGNvdmVyYWdlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBhcnRpYWwgbGlzdCBvZiByb3V0aW5nIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi4gVGhpcyBsaXN0IGlzIHByb3ZpZGVkIGZvciB0aGUgcHVycG9zZSBvZiBsb29raW5nIHVwIGluc3RpdHV0aW9ucyBieSByb3V0aW5nIG51bWJlci4gSXQgaXMgbm90IGNvbXByZWhlbnNpdmUgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkIGFzIGEgY29tcGxldGUgbGlzdCBvZiByb3V0aW5nIG51bWJlcnMgZm9yIGFuIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIHBhcnRpYWwgbGlzdCBvZiBEVEMgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGR0Y19udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdGl0dXRpb24gaGFzIGFuIE9BdXRoIGxvZ2luIGZsb3cuIFRoaXMgd2lsbCBiZSBgdHJ1ZWAgaWYgT0F1dGggaXMgc3VwcG9ydGVkIGZvciBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgZXZlbiBpZiB0aGUgaW5zdGl0dXRpb24gYWxzbyBzdXBwb3J0cyBub24tT0F1dGggY29ubmVjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgb2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHN0YXR1cz86IEluc3RpdHV0aW9uU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25NZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGF1dGhfbWV0YWRhdGE/OiBBdXRoTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGFuIGluc3RpdHV0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGhlYWx0aCBvZiBpdHMgSXRlbSBsb2dpbnMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBBdXRoIHJlcXVlc3RzLCBCYWxhbmNlIHJlcXVlc3RzLCBJZGVudGl0eSByZXF1ZXN0cywgSW52ZXN0bWVudHMgcmVxdWVzdHMsIGFuZCBMaWFiaWxpdGllcyByZXF1ZXN0cy4gQSBsb2dpbiBhdHRlbXB0IGlzIGNvbmR1Y3RlZCBkdXJpbmcgdGhlIGluaXRpYWwgSXRlbSBhZGQgaW4gTGluay4gSWYgdGhlcmUgaXMgbm90IGVub3VnaCB0cmFmZmljIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRlIGFuIGluc3RpdHV0aW9uXFwncyBzdGF0dXMsIFBsYWlkIHdpbGwgcmV0dXJuIG51bGwgcmF0aGVyIHRoYW4gcG90ZW50aWFsbHkgaW5hY2N1cmF0ZSBkYXRhLiAgSW5zdGl0dXRpb24gc3RhdHVzIGlzIGFjY2Vzc2libGUgaW4gdGhlIERhc2hib2FyZCBhbmQgdmlhIHRoZSBBUEkgdXNpbmcgdGhlIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAgZW5kcG9pbnQgd2l0aCB0aGUgYGluY2x1ZGVfc3RhdHVzYCBvcHRpb24gc2V0IHRvIHRydWUuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbiBzdGF0dXMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGl0ZW1fbG9naW5zPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBhdXRoPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50c191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHJlY2VudCBoZWFsdGggaW5jaWRlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEhlYWx0aEluY2lkZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBoZWFsdGhfaW5jaWRlbnRzPzogQXJyYXk8SGVhbHRoSW5jaWRlbnQ+IHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBpbnN0aXR1dGlvbiBzdGF0dXMgbWVldHMgdGhlIGNvbmRpdGlvbnMgY29uZmlndXJlZCBpbiB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYERBU0hCT0FSRF9DT05GSUdVUkVEX0FMRVJUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOU1RJVFVUSU9OX1NUQVRVU19BTEVSVF9UUklHR0VSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBnbG9iYWwgc3VjY2VzcyByYXRlIG9mIHRoZSBpbnN0aXR1dGlvbiwgY2FsY3VsYXRlZCBiYXNlZCBvbiBpdGVtIGFkZCBoZWFsdGguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9vdmVyYWxsX3N1Y2Nlc3NfcmF0ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIFJUUCBuZXR3b3JrIGFuZCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3JrcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUH1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICAgICAqL1xuICAgIHJ0cDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFA7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0byBnZXQgZGV0YWlscyBhYm91dFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIGFuIGluc3RpdHV0aW9uXFwncyBsb2dvLCBicmFuZCBjb2xvciwgYW5kIFVSTC4gV2hlbiBhdmFpbGFibGUsIHRoZSBiYW5rXFwncyBsb2dvIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcsIHRoZSBicmFuZCBjb2xvciBpcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEkgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGl0dXRpb24uIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9zdGF0dXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIEluc3RpdHV0aW9ucyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gc2tpcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoaWNoIHByb2R1Y3RzIHRoZXkgc3VwcG9ydC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiByb3V0aW5nIG51bWJlcnMgdG8gZmlsdGVyIGluc3RpdHV0aW9ucy4gVGhlIHJlc3BvbnNlIHdpbGwgb25seSByZXR1cm4gaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggYWxsIG9mIHRoZSByb3V0aW5nIG51bWJlcnMgaW4gdGhlIGFycmF5LiBSb3V0aW5nIG51bWJlciByZWNvcmRzIHVzZWQgZm9yIHRoaXMgbWF0Y2hpbmcgYXJlIG5vdCBjb21wcmVoZW5zaXZlOyBmYWlsdXJlIHRvIG1hdGNoIGEgZ2l2ZW4gcm91dGluZyBudW1iZXIgdG8gYW4gaW5zdGl0dXRpb24gZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBpbnN0aXR1dGlvbiBpcyB1bnN1cHBvcnRlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbnMgd2lsbCBoYXZlIGBvYXV0aGAgc2V0IHRvIGB0cnVlYCBpZiBzb21lIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgT0F1dGggZmxvd3M7IGluc3RpdHV0aW9ucyBpbiBhIHN0YXRlIG9mIG1pZ3JhdGlvbiB0byBPQXV0aCB3aWxsIGhhdmUgdGhlIGBvYXV0aGAgYXR0cmlidXRlIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJLCBhbmQgdGhhdCBieSBhY2Nlc3Npbmcgb3IgdXNpbmcgdGhlc2UgbG9nb3MsIHlvdSBhZ3JlZSB0aGF0IHlvdSBhcmUgZG9pbmcgc28gYXQgeW91ciBvd24gcmlzayBhbmQgd2lsbCwgaWYgbmVjZXNzYXJ5LCBvYnRhaW4gYWxsIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZyb20gdGhlIGFwcHJvcHJpYXRlIHJpZ2h0cyBob2xkZXJzIGFuZCBhZGhlcmUgdG8gYW55IGFwcGxpY2FibGUgdXNhZ2UgZ3VpZGVsaW5lcy4gUGxhaWQgZGlzY2xhaW1zIGFsbCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ29zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFBsYWlkIGluc3RpdHV0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYXZhaWxhYmxlIHZpYSB0aGlzIGVuZHBvaW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gYWNjb3VudCBmaWx0ZXIgdG8gYXBwbHkgdG8gaW5zdGl0dXRpb25zIHNlYXJjaCByZXF1ZXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciBpbnN0aXR1dGlvbnMgYnkgdmFyaW91cyBQYXltZW50IEluaXRpYXRpb24gY29uZmlndXJhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeS4gSW5zdGl0dXRpb25zIHdpdGggbmFtZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IGFyZSByZXR1cm5lZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBzdXBwb3J0IGFsbCBwcm9kdWN0cyBsaXN0ZWQgaW4gYHByb2R1Y3RzYC4gUHJvdmlkZSBgbnVsbGAgdG8gZ2V0IGluc3RpdHV0aW9ucyByZWdhcmRsZXNzIG9mIHN1cHBvcnRlZCBwcm9kdWN0cy4gTm90ZSB0aGF0IHdoZW4gYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGlmIHlvdSBhcmUgZW5hYmxlZCBmb3IgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMsIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgcHJvZHVjdHMgd2lsbCBiZSByZXR1cm5lZCBldmVuIGlmIGBhdXRoYCBpcyBub3QgcHJlc2VudCBpbiB0aGVpciBwcm9kdWN0IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBOb3RlIHRoYXQgaW5zdGl0dXRpb25zIHdpbGwgaGF2ZSBgb2F1dGhgIHNldCB0byBgdHJ1ZWAgaWYgc29tZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQgdG8gdXNlIE9BdXRoIGZsb3dzOyBpbnN0aXR1dGlvbnMgaW4gYSBzdGF0ZSBvZiBtaWdyYXRpb24gdG8gT0F1dGggd2lsbCBoYXZlIHRoZSBgb2F1dGhgIGF0dHJpYnV0ZSBzZXQgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaW5pdGlhdGlvbj86IEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBpbnN0aXR1dGlvbnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtaW52ZXN0bWVudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFN1YnR5cGUge1xuICAgIF81MjkgPSAnNTI5JyxcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBMaWYgPSAnbGlmJyxcbiAgICBMaWZlSW5zdXJhbmNlID0gJ2xpZmUgaW5zdXJhbmNlJyxcbiAgICBMaXJhID0gJ2xpcmEnLFxuICAgIExyaWYgPSAnbHJpZicsXG4gICAgTHJzcCA9ICdscnNwJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBOb25DdXN0b2RpYWxXYWxsZXQgPSAnbm9uLWN1c3RvZGlhbCB3YWxsZXQnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJBbm51aXR5ID0gJ290aGVyIGFubnVpdHknLFxuICAgIE90aGVySW5zdXJhbmNlID0gJ290aGVyIGluc3VyYW5jZScsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFByb2ZpdFNoYXJpbmdQbGFuID0gJ3Byb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFFzaHIgPSAncXNocicsXG4gICAgUmRzcCA9ICdyZHNwJyxcbiAgICBSZXNwID0gJ3Jlc3AnLFxuICAgIFJldGlyZW1lbnQgPSAncmV0aXJlbWVudCcsXG4gICAgUmxpZiA9ICdybGlmJyxcbiAgICBSb3RoID0gJ3JvdGgnLFxuICAgIFJvdGg0MDFrID0gJ3JvdGggNDAxaycsXG4gICAgUnJpZiA9ICdycmlmJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNhcnNlcCA9ICdzYXJzZXAnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGVnYWN5IGZpZWxkIGZvcm1lcmx5IHVzZWQgaW50ZXJuYWxseSBieSBQbGFpZCB0byBpZGVudGlmeSBjZXJ0YWluIGNhbmNlbGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhbmNlbF90cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhZ2FpbnN0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gcG9zdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb27igJlzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgZm9yIGJ1eSB0cmFuc2FjdGlvbnM7IG5lZ2F0aXZlIGZvciBzZWxsIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZSB7XG4gICAgQWNjb3VudEZlZSA9ICdhY2NvdW50IGZlZScsXG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBc3NpZ25tZW50ID0gJ2Fzc2lnbm1lbnQnLFxuICAgIEJ1eSA9ICdidXknLFxuICAgIEJ1eVRvQ292ZXIgPSAnYnV5IHRvIGNvdmVyJyxcbiAgICBDb250cmlidXRpb24gPSAnY29udHJpYnV0aW9uJyxcbiAgICBEZXBvc2l0ID0gJ2RlcG9zaXQnLFxuICAgIERpc3RyaWJ1dGlvbiA9ICdkaXN0cmlidXRpb24nLFxuICAgIERpdmlkZW5kID0gJ2RpdmlkZW5kJyxcbiAgICBEaXZpZGVuZFJlaW52ZXN0bWVudCA9ICdkaXZpZGVuZCByZWludmVzdG1lbnQnLFxuICAgIEV4ZXJjaXNlID0gJ2V4ZXJjaXNlJyxcbiAgICBFeHBpcmUgPSAnZXhwaXJlJyxcbiAgICBGdW5kRmVlID0gJ2Z1bmQgZmVlJyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgSW50ZXJlc3RSZWNlaXZhYmxlID0gJ2ludGVyZXN0IHJlY2VpdmFibGUnLFxuICAgIEludGVyZXN0UmVpbnZlc3RtZW50ID0gJ2ludGVyZXN0IHJlaW52ZXN0bWVudCcsXG4gICAgTGVnYWxGZWUgPSAnbGVnYWwgZmVlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdsb2FuIHBheW1lbnQnLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW4gPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgTWFuYWdlbWVudEZlZSA9ICdtYW5hZ2VtZW50IGZlZScsXG4gICAgTWFyZ2luRXhwZW5zZSA9ICdtYXJnaW4gZXhwZW5zZScsXG4gICAgTWVyZ2VyID0gJ21lcmdlcicsXG4gICAgTWlzY2VsbGFuZW91c0ZlZSA9ICdtaXNjZWxsYW5lb3VzIGZlZScsXG4gICAgTm9uUXVhbGlmaWVkRGl2aWRlbmQgPSAnbm9uLXF1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgTm9uUmVzaWRlbnRUYXggPSAnbm9uLXJlc2lkZW50IHRheCcsXG4gICAgUGVuZGluZ0NyZWRpdCA9ICdwZW5kaW5nIGNyZWRpdCcsXG4gICAgUGVuZGluZ0RlYml0ID0gJ3BlbmRpbmcgZGViaXQnLFxuICAgIFF1YWxpZmllZERpdmlkZW5kID0gJ3F1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgUmViYWxhbmNlID0gJ3JlYmFsYW5jZScsXG4gICAgUmV0dXJuT2ZQcmluY2lwYWwgPSAncmV0dXJuIG9mIHByaW5jaXBhbCcsXG4gICAgUmVxdWVzdCA9ICdyZXF1ZXN0JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIFNlbGxTaG9ydCA9ICdzZWxsIHNob3J0JyxcbiAgICBTZW5kID0gJ3NlbmQnLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIFNwaW5PZmYgPSAnc3BpbiBvZmYnLFxuICAgIFNwbGl0ID0gJ3NwbGl0JyxcbiAgICBTdG9ja0Rpc3RyaWJ1dGlvbiA9ICdzdG9jayBkaXN0cmlidXRpb24nLFxuICAgIFRheCA9ICd0YXgnLFxuICAgIFRheFdpdGhoZWxkID0gJ3RheCB3aXRoaGVsZCcsXG4gICAgVHJhZGUgPSAndHJhZGUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBUcmFuc2ZlckZlZSA9ICd0cmFuc2ZlciBmZWUnLFxuICAgIFRydXN0RmVlID0gJ3RydXN0IGZlZScsXG4gICAgVW5xdWFsaWZpZWRHYWluID0gJ3VucXVhbGlmaWVkIGdhaW4nLFxuICAgIFdpdGhkcmF3YWwgPSAnd2l0aGRyYXdhbCdcbn1cblxuLyoqXG4gKiBWYWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYW5jZWxgOiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgd2hpY2ggbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyICBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIENhbmNlbCA9ICdjYW5jZWwnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgRmVlID0gJ2ZlZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInXG59XG5cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBQ0FUUz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2F0cz86IEFycmF5PE51bWJlcnNBQ0FUUz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBVE9OPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGF0b24/OiBBcnJheTxOdW1iZXJzQVRPTj47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXRyaWV2ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXJzIGZvciB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEludmVzdG1lbnRzQXV0aEdldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIHRoZSBvd25lcnNoaXAgb2YgYW4gaW52ZXN0bWVudHMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoT3duZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGlkZW50aXR5IGluZm9ybWF0aW9uIHBlcnRhaW5zIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSW4gdGhlIGNhc2Ugb2YgYSBqb2ludCBhY2NvdW50LCBQbGFpZCB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIGFsbCBhY2NvdW50IGhvbGRlcnMuICBJZiBhbiBJdGVtIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHdpdGggZGlmZmVyZW50IG93bmVyIG5hbWVzLCBzb21lIGluc3RpdHV0aW9ucyB3aWxsIHJlcG9ydCBhbGwgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGluIGVhY2ggYWNjb3VudFxcJ3MgYG5hbWVzYCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIGFmdGVyIGFuIGFzeW5jaHJvbm91cyBleHRyYWN0aW9uIG9uIGFuIGludmVzdG1lbnRzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxlZCB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjYW5jZWxlZF9pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwIHdoZW4gZmV0Y2hpbmcgdHJhbnNhY3Rpb24gaGlzdG9yeVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnZlc3RtZW50cyBwcm9kdWN0IHZpYSB0aGUgYHByb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGluaXRpYWwgSW52ZXN0bWVudHMgZXh0cmFjdGlvbiB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4gUGxhaWQgd2lsbCBzdWJzZXF1ZW50bHkgZmlyZSBhIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aGVuIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy4gV2hlbiBgZmFsc2VgLCBQbGFpZCB3aWxsIHdhaXQgdG8gcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgZXh0cmFjdGlvbiBjb21wbGV0aW9uIGFuZCBubyBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2lsbCBmaXJlLiBOb3RlIHRoYXQgd2hpbGUgdGhlIGV4dHJhY3Rpb24gaXMgaGFwcGVuaW5nIGFzeW5jaHJvbm91c2x5LCBjYWxscyB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIHdpbGwgcmV0dXJuIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3JzIHVudGlsIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFzeW5jX3VwZGF0ZT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBiZWluZyBmZXRjaGVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBQb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi4gTXVzdCBiZSBmb3JtYXR0ZWQgYXMgYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvblxcJ3MgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gTXVzdCBiZSBwb3NpdGl2ZSBpZiB0aGUgdHlwZSBpcyBhIGJ1eSBhbmQgbmVnYXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBzZWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBmZWVzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgYnV5YDogQnV5aW5nIGFuIGludmVzdG1lbnQgYHNlbGxgOiBTZWxsaW5nIGFuIGludmVzdG1lbnQgYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIHZhbGlkIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VjdXJpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHNlY3VyaXR5PzogU2VjdXJpdHlPdmVycmlkZTtcbn1cbi8qKlxuICogQSBiaW5hcnkgbWF0Y2ggaW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgY291bnRyeSB0aGF0IGlzc3VlZCB0aGUgcHJvdmlkZWQgZG9jdW1lbnQgbWF0Y2hlcyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gUGxhaWQuICBOb3RlOiBZb3UgY2FuIGNvbmZpZ3VyZSB3aGV0aGVyIGEgYG5vX21hdGNoYCBvbiBgaXNzdWluZ19jb3VudHJ5YCBmYWlscyB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgYnkgZWRpdGluZyB5b3VyIFBsYWlkIFRlbXBsYXRlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXNzdWluZ0NvdW50cnkge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZC4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYmlsbGVkX3Byb2R1Y3RzYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgYXZhaWxhYmxlX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgaGF2ZSBiZWVuIGJpbGxlZCBmb3IgdGhlIEl0ZW0uIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IHdpbGwgYmUgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGF2YWlsYWJsZV9wcm9kdWN0c2AuIE5vdGUgLSBgYmlsbGVkX3Byb2R1Y3RzYCBpcyBwb3B1bGF0ZWQgaW4gYWxsIGVudmlyb25tZW50cyBidXQgb25seSByZXF1ZXN0cyBpbiBQcm9kdWN0aW9uIGFyZSBiaWxsZWQuIEFsc28gbm90ZSB0aGF0IHByb2R1Y3RzIHRoYXQgYXJlIGJpbGxlZCBvbiBhIHBheS1wZXItY2FsbCBiYXNpcyByYXRoZXIgdGhhbiBhIHBheS1wZXItSXRlbSBiYXNpcywgc3VjaCBhcyBgYmFsYW5jZWAsIHdpbGwgbm90IGFwcGVhciBoZXJlLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgYmlsbGVkX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGFkZGVkIHRvIHRoZSBJdGVtLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGBiaWxsZWRfcHJvZHVjdHNgIGZpZWxkLiBGb3Igc29tZSBwcm9kdWN0cywgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGFuIEl0ZW0gYnV0IG5vdCB5ZXQgYmlsbGVkIChlLmcuIEFzc2V0cywgYmVmb3JlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgaGFzIGJlZW4gY2FsbGVkLCBvciBBdXRoIG9yIElkZW50aXR5IHdoZW4gYWRkZWQgYXMgT3B0aW9uYWwgUHJvZHVjdHMgYnV0IGJlZm9yZSB0aGVpciBlbmRwb2ludHMgaGF2ZSBiZWVuIGNhbGxlZCksIGluIHdoaWNoIGNhc2UgdGhlIHByb2R1Y3QgbWF5IGFwcGVhciBpbiBgcHJvZHVjdHNgIGJ1dCBub3QgaW4gYGJpbGxlZF9wcm9kdWN0c2AuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGdvbmUgdGhyb3VnaCBjb25zZW50IGNvbGxlY3Rpb24gZm9yIHRoZSBJdGVtLiBPbmx5IHByZXNlbnQgZm9yIHRob3NlIGVuYWJsZWQgaW4gdGhlIFtEYXRhIFRyYW5zcGFyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpIGJldGEuIElmIHlvdSBhcmUgbm90IGVucm9sbGVkIGluIERhdGEgVHJhbnNwYXJlbmN5LCB0aGlzIGZpZWxkIGlzIG5vdCB1c2VkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBSRkMgMzMzOSB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGNvbnNlbnQgcHJvdmlkZWQgYnkgdGhlIGVuZCB1c2VyIHdpbGwgZXhwaXJlLiBVcG9uIGNvbnNlbnQgZXhwaXJhdGlvbiwgdGhlIGl0ZW0gd2lsbCBlbnRlciB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlLiBUbyBjaXJjdW12ZW50IHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3IgYW5kIG1haW50YWluIGNvbnRpbnVvdXMgY29uc2VudCwgdGhlIGVuZCB1c2VyIGNhbiByZWF1dGhlbnRpY2F0ZSB2aWEgTGlua+KAmXMgdXBkYXRlIG1vZGUgaW4gYWR2YW5jZSBvZiB0aGUgY29uc2VudCBleHBpcmF0aW9uIHRpbWUuICBOb3RlIC0gVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucy4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgSXRlbXMgd2l0aCBzb21lIGZvcm1zIG9mIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24uICBgYmFja2dyb3VuZGAgLSBJdGVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBiYWNrZ3JvdW5kICBgdXNlcl9wcmVzZW50X3JlcXVpcmVkYCAtIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHVwZGF0ZV90eXBlOiBJdGVtVXBkYXRlVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSXRlbVVwZGF0ZVR5cGVFbnVtIHtcbiAgICBCYWNrZ3JvdW5kID0gJ2JhY2tncm91bmQnLFxuICAgIFVzZXJQcmVzZW50UmVxdWlyZWQgPSAndXNlcl9wcmVzZW50X3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbmV3X2FjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWN0aXZpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzOiBBcnJheTxBY3Rpdml0eT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRpbWVzdGFtcHMgZm9yIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhIHR5cGUgd2FzIGFjY2Vzc2VkIHBlciBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGFzdERhdGFBY2Nlc3NUaW1lcz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3RfZGF0YV9hY2Nlc3NfdGltZXM6IEFycmF5PExhc3REYXRhQWNjZXNzVGltZXM+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgZm9yIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+O1xufVxuLyoqXG4gKiBVc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMsIGZvciBjbGllbnRzIG1ha2luZyBhIHJlcXVlc3Qgd2l0aG91dCBhbiBgYWNjZXNzX3Rva2VuYC4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHNlbGVjdCBjbGllbnRzIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4gTW9zdCBjbGllbnRzIHNob3VsZCBjYWxsIC9pdGVtL2ltcG9ydCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IHVzZXJuYW1lIGhhc2hlZCBieSBGSS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICBmaV91c2VybmFtZV9oYXNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlczogU2NvcGVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGR1cmluZyBlbnJvbGxtZW50LCB0aGlzIGZpZWxkIG11c3QgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHN0YXRlIHNlbnQgdG8gdGhlIHBhcnRuZXIgaW4gdGhlIE9BdXRoIExvZ2luIFVSSS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGBFTlJPTExNRU5UYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc0NvbnRleHR9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb250ZXh0OiBTY29wZXNDb250ZXh0O1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmsvYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggTGlua+KAmXMgdXBkYXRlIG1vZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSXRlbUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgIGFuZCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzPzogSXRlbVN0YXR1c051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwcm9kdWN0IHN0cmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGh9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9hdXRoOiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGNvbmZpZ3VyZSBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggYW4gSXRlbS4gUGxhaWQgZmlyZXMgYSB3ZWJob29rIGlmIGNyZWRlbnRpYWxzIGZhaWwuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBvZiB1c2VyIElEIGFuZCBhdXRoIHRva2VuIHBhaXIsIHBlcm1pdHRpbmcgUGxhaWQgdG8gYWdncmVnYXRlIGEgdXNlcuKAmXMgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aCB7XG4gICAgLyoqXG4gICAgICogT3BhcXVlIHVzZXIgaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXV0aG9yaXphdGlvbiB0b2tlbiBQbGFpZCB3aWxsIHVzZSB0byBhZ2dyZWdhdGUgdGhpcyB1c2Vy4oCZcyBhY2NvdW50c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICBhdXRoX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1JbXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBoYXMgZXhpdGVkIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgZ29uZSB0aHJvdWdoIHRoZSB1cGRhdGUgbW9kZSBmbG93IGluIHlvdXIgYXBwICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIHVzZXIgY29tcGxldGVkIHRoZSB1cGRhdGUgbW9kZSBpbiBhIGRpZmZlcmVudCBhcHApLiBJZiB5b3UgaGF2ZSBtZXNzYWdpbmcgdGhhdCB0ZWxscyB0aGUgdXNlciB0byBjb21wbGV0ZSB0aGUgdXBkYXRlIG1vZGUgZmxvdywgeW91IHNob3VsZCBzaWxlbmNlIHRoaXMgbWVzc2FnaW5nIHVwb24gcmVjZWl2aW5nIHRoZSBgTE9HSU5fUkVQQUlSRURgIHdlYmhvb2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExPR0lOX1JFUEFJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgb25jZSBQbGFpZCBjYWxjdWxhdGVzIGluY29tZSBmcm9tIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGBwdWJsaWNfdG9rZW5gIGZvciB0aGUgcGFydGljdWxhciBJdGVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBgYWNjZXNzX3Rva2VuYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIGBwdWJsaWNfdG9rZW5gLCBvYnRhaW5lZCBmcm9tIHRoZSBMaW5rIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9yIGAvc2FuZGJveC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1SZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0ludmVzdG1lbnRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBmYWlsZWQgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHdlYmhvb2sgZmlyZWQgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSB3ZWJob29rIHdhcyBmaXJlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgc2VudF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3Qgd2ViaG9vayBjb2RlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgY29kZV9zZW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBsYXN0X3dlYmhvb2s/OiBJdGVtU3RhdHVzTGFzdFdlYmhvb2sgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgSXRlbS4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGFuIEl0ZW0sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbSldUIGxpYnJhcmllc10oaHR0cHM6Ly9qd3QuaW8vI2xpYnJhcmllcy1pbykgdG8gdmVyaWZ5IFBsYWlkIHdlYmhvb2tzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXS1B1YmxpY0tleVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgSldLUHVibGljS2V5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFsZyBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcnYgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgY3VydmUgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3J2OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtpZCAoS2V5IElEKSBtZW1iZXIgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gY2hvb3NlIGFtb25nIGEgc2V0IG9mIGtleXMgd2l0aGluIHRoZSBKV0sgZHVyaW5nIGtleSByb2xsb3Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBraWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga3R5IChrZXkgdHlwZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleSwgc3VjaCBhcyBSU0Egb3IgRUMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga3R5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZSAocHVibGljIGtleSB1c2UpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgdXNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHggbWVtYmVyIGNvbnRhaW5zIHRoZSB4IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBKV1RIZWFkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICB0eXBlOiBBZGRyZXNzUHVycG9zZUxhYmVsO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBkYXRlX29mX2JpcnRoYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYGt5Y19jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmt5Y19jaGVja2AgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGBreWNfY2hlY2tgIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyBgc3RlcHMua3ljX2NoZWNrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tBZGRyZXNzU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYWRkcmVzczogS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tOYW1lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgbmFtZTogS1lDQ2hlY2tOYW1lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0lETnVtYmVyU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBLWUNDaGVja0lETnVtYmVyU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tQaG9uZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogS1lDQ2hlY2tQaG9uZVN1bW1hcnk7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGlkX251bWJlcmAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgbmFtZWAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja05hbWVTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgcGhvbmVgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5XG4gICAgICovXG4gICAgYXJlYV9jb2RlOiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGxhc3QgdGltZSBlYWNoIGRhdGF0eXBlIHdhcyBhY2Nlc3NlZCBieSBhbiBhcHBsaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGFzdERhdGFBY2Nlc3NUaW1lcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhcHBsaWNhdGlvbiBhY2Nlc3NpbmcgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfYmFsYW5jZV9pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfYmFsYW5jZV9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgYWNjb3VudF9yb3V0aW5nX251bWJlciB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X3JvdXRpbmdfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY29udGFjdF9kZXRhaWxzIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGNvbnRhY3RfZGV0YWlsczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIHRyYW5zYWN0aW9ucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBjcmVkaXRfYW5kX2xvYW5zIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGNyZWRpdF9hbmRfbG9hbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBpbnZlc3RtZW50cyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIHBheXJvbGxfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luZm86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbl9yaXNrX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fcmlza19pbmZvOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBvZiB0eXBlIGBMSUFCSUxJVElFU2AgYW5kIGNvZGUgYERFRkFVTFRfVVBEQVRFYCB3aWxsIGJlIGZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgbGlhYmlsaXRpZXMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGEgbGlhYmlsaXRpZXMgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJQUJJTElUSUVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYFxcJ3MgZm9yIGFjY291bnRzIHRoYXQgY29udGFpbiBuZXcgbGlhYmlsaXRpZXMuXFwnXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX25ld19saWFiaWxpdGllczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgbGlhYmlsaXRpZXMgZmllbGRzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJwYXN0X2Ftb3VudF9kdWVcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2xpYWJpbGl0aWVzOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9saWFiaWxpdGllcy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBgb3B0aW9uc2AgY2Fubm90IGJlIG51bGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbGlhYmlsaXR5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjcmVkaXQgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIGNyZWRpdDogQXJyYXk8Q3JlZGl0Q2FyZExpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3J0Z2FnZSBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIG1vcnRnYWdlOiBBcnJheTxNb3J0Z2FnZUxpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHVkZW50IGxvYW4gYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFN0dWRlbnRMb2FuPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBzdHVkZW50OiBBcnJheTxTdHVkZW50TG9hbj4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSBTYW5kYm94IHRlc3QgZGF0YSBmb3IgdGhlIExpYWJpbGl0aWVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGxpYWJpbGl0eSBvYmplY3QsIGVpdGhlciBgY3JlZGl0YCBvciBgc3R1ZGVudGAuIE1vcnRnYWdlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlIGN1c3RvbSBTYW5kYm94LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdXJjaGFzZSBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gRm9yIHNpbXBsaWNpdHksIHRoaXMgaXMgdGhlIG9ubHkgaW50ZXJlc3QgcmF0ZSB1c2VkIHRvIGNhbGN1bGF0ZSBpbnRlcmVzdCBjaGFyZ2VzLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHVyY2hhc2VfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNhc2ggQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjYXNoX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHRyYW5zZmVyIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgYmFsYW5jZV90cmFuc2Zlcl9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lhbCBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNwZWNpYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsYXN0X3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYG1pbmltdW1fcGF5bWVudF9hbW91bnRgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgIG9yIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGlzX292ZXJkdWVgIGZpZWxkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBsb2FuIHByaW5jaXBhbC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmluY2lwYWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbm9taW5hbF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGludGVyZXN0IGNhcGl0YWxpemF0aW9uIGJlZ2lucyBhdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1vbnRocyBhZnRlciBsb2FuIG9yaWdpbmF0aW9uLiBCeSBkZWZhdWx0IGludGVyZXN0IGlzIG5ldmVyIGNhcGl0YWxpemVkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGludGVyZXN0X2NhcGl0YWxpemF0aW9uX2dyYWNlX3BlcmlvZF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9kZWw6IFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWw7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBleHBlY3RlZF9wYXlvZmZfZGF0ZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZXhwZWN0ZWRfcGF5b2ZmX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGd1YXJhbnRvcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZ3VhcmFudG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19mZWRlcmFsYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfZmVkZXJhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGxvYW5fbmFtZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fc3RhdHVzOiBTdHVkZW50TG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi5kZXNjcmlwdGlvbmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLnR5cGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC4gUG9zc2libGUgdmFsdWVzIGFyZTogYFxcXCJleHRlbmRlZCBncmFkdWF0ZWRcXFwiYCwgYFxcXCJleHRlbmRlZCBzdGFuZGFyZFxcXCJgLCBgXFxcImdyYWR1YXRlZFxcXCJgLCBgXFxcImluY29tZS1jb250aW5nZW50IHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1iYXNlZCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbnRlcmVzdCBvbmx5XFxcImAsIGBcXFwib3RoZXJcXFwiYCwgYFxcXCJwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJyZXZpc2VkIHBheSBhcyB5b3UgZWFyblxcXCJgLCBgXFxcInN0YW5kYXJkXFxcImAsIG9yIGBcXFwic2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBzZXF1ZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNlcXVlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNlcnZpY2VyX2FkZHJlc3M6IEFkZHJlc3M7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGNhbGxiYWNrIGZyb20gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtDYWxsYmFja01ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhbGxiYWNrX3R5cGU/OiBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRXZlbnROYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGV2ZW50X25hbWU/OiBMaW5rRXZlbnROYW1lO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGVyZSBpbiB0aGUgZmxvdyB0aGUgTGluayB1c2VyIGV4aXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgU3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYWNjb3VudHMgd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua0RlbGl2ZXJ5QWNjb3VudD47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIGFjY291bnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElmIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGlzIGJlaW5nIHVzZWQsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IGJlaW5nIHZlcmlmaWVkIGlzIGEgYGJ1c2luZXNzYCBvciBgcGVyc29uYWxgIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGNsYXNzX3R5cGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2sgY29udGFpbmluZyBtZXRhZGF0YSBwcm94aWVkIG92ZXIgZnJvbSBMaW5rIGNhbGxiYWNrIGUuZyBgb25FdmVudGAsIGBvbkV4aXRgLCBgb25TdWNjZXNzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgTElOS19ERUxJVkVSWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgTElOS19DQUxMQkFDS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0NhbGxiYWNrTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfY2FsbGJhY2tfbWV0YWRhdGE6IExpbmtDYWxsYmFja01ldGFkYXRhO1xufVxuLyoqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBtZXRob2QgY29udGFpbmluZyBib3RoIHRoZSB0eXBlIGFuZCBhZGRyZXNzIHRvIHNlbmQgdGhlIFVSTC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gICAgICovXG4gICAgbWV0aG9kPzogTGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2Q7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciAvIGVtYWlsIGFkZHJlc3MgdGhhdCBIb3N0ZWQgTGluayBzZXNzaW9ucyBhcmUgZGVsaXZlcmVkIHRvLiBQaG9uZSBudW1iZXJzIG11c3QgYmUgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaW5rRGVsaXZlcnlPcHRpb25zO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24sIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGVsaXZlcnkgbWV0aG9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLiBTYW1lIGFzIHRoZSBgbGlua190b2tlbmAgc3RyaW5nIGV4Y2x1ZGluZyB0aGUgXFxcImxpbmste2Vudn0tXFxcIiBwcmVmaXguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZWxpdmVyeSBtZXRob2QgdG8gYmUgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTC4gIGBTTVNgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggU01TICBgRU1BSUxgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggZW1haWxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiBmcm9tIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtEZWxpdmVyeUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IExpbmtEZWxpdmVyeVNlc3Npb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gSG9zdGVkIExpbmsgc2Vzc2lvbiB3YXMgY3JlYXRlZCBhdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uIHdhcyBjb21wbGV0ZWQgYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIFxcJ1dlbGxzIEZhcmdvXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBpbnN0aXR1dGlvbiBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgcmVsYXRlZCB0byB0aGUgZGVsaXZlcnkgb2YgdGhlIGxpbmsgc2Vzc2lvbiB0byB1c2Vyc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gICAgICovXG4gICAgY29tbXVuaWNhdGlvbl9tZXRob2Q/OiBMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICAgICAqL1xuICAgIGRlbGl2ZXJ5X3N0YXR1cz86IExpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1cztcbn1cbi8qKlxuICogT3B0aW9uYWwgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5UmVjaXBpZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlPcHRpb25zXG4gICAgICovXG4gICAgcmVjaXBpZW50PzogTGlua0RlbGl2ZXJ5UmVjaXBpZW50O1xufVxuLyoqXG4gKiBNZXRhZGF0YSByZWxhdGVkIHRvIHRoZSByZWNpcGllbnQuIElmIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBwb3B1bGF0ZSB0aGlzIGZpZWxkIGlzIG5vdCBhdmFpbGFibGUsIGxlYXZlIGl0IGJsYW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY29tbXVuaWNhdGlvbiBtZXRob2RzIHRvIHNlbmQgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gVVJMIHRvLiBJZiBkZWxpdmVyeSBpcyBub3QgcmVxdWlyZWQsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZHM/OiBBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPjtcbiAgICAvKipcbiAgICAgKiBGaXJzdCBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdpbGwgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwgLyB0ZXh0IChpZiBjb25maWd1cmVkKS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24uICBgQ1JFQVRFRGA6IFRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgYWNjZXNzZWQgYnkgdGhlIHVzZXIgIGBPUEVORURgOiBUaGUgc2Vzc2lvbiBpcyBvcGVuZWQgYnkgdGhlIHVzZXIgYnV0IG5vdCB5ZXQgY29tcGxldGVkICBgRVhJVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gZXhpdGVkIGJ5IHRoZSB1c2VyICBgQ09NUExFVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gY29tcGxldGVkIGJ5IHRoZSB1c2VyICBgRVhQSVJFRGA6IFRoZSBzZXNzaW9uIGhhcyBleHBpcmVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzIHtcbiAgICBDcmVhdGVkID0gJ0NSRUFURUQnLFxuICAgIE9wZW5lZCA9ICdPUEVORUQnLFxuICAgIEV4aXRlZCA9ICdFWElURUQnLFxuICAgIENvbXBsZXRlZCA9ICdDT01QTEVURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgTGluayBjYWxsYmFjayBldmVudFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZSB7XG4gICAgU3VjY2VzcyA9ICdPTl9TVUNDRVNTJyxcbiAgICBFdmVudCA9ICdPTl9FVkVOVCcsXG4gICAgRXhpdCA9ICdPTl9FWElUJ1xufVxuXG4vKipcbiAqIFRoZSBjb21tdW5pY2F0aW9uIG1ldGhvZCB1c2VkIHRvIGRlbGl2ZXIgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgdG8gdGhlIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdXNlciB3YXMgZ29pbmcgdGhyb3VnaCBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtFdmVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVVSUQgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWR1cGxpY2F0ZSBldmVudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCBhbiBldmVudCB0aGF0IG9jY3VyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRNZXRhZGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgdHlwZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMga2V5IGluZGljYXRlcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIEVtaXR0ZWQgYnk6IGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGV4aXRfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB1c2VkIHRvIHNlYXJjaCBmb3IgaW5zdGl0dXRpb25zLiBFbWl0dGVkIGJ5OiBgU0VBUkNIX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlYXJjaF9xdWVyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIGhhcyBlbmNvdW50ZXJlZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBNRkEgdHlwZXM6IGNvZGUsIGRldmljZSwgcXVlc3Rpb25zLCBzZWxlY3Rpb25zLiBFbWl0dGVkIGJ5OiBgU1VCTUlUX01GQWAgYW5kIGBUUkFOU0lUSU9OX1ZJRVdgIHdoZW4gdmlld19uYW1lIGlzIGBNRkFgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbWZhX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHZpZXcgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8uIEVtaXR0ZWQgYnk6IGBUUkFOU0lUSU9OX1ZJRVdgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdmlld19uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciB0aGUgdmVyaWZpY2F0aW9uIG1ldGhvZCBmb3IgYSBtYXRjaGVkIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBBdXRoIFR5cGUgU2VsZWN0IGZsb3cgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgc2VsZWN0ZWQgdmVyaWZpY2F0aW9uIG1ldGhvZCwgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBwaG9uZW90cGAgb3IgYHBhc3N3b3JkYDsgIGlmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZWxlY3RlZCBBdXRoIFR5cGUgU2VsZWN0IGZsb3csIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgZmxvd190eXBlX21hbnVhbGAgb3IgYGZsb3dfdHlwZV9pbnN0YW50YC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX1ZFUklGWV9NRVRIT0RgIGFuZCBgU0VMRUNUX0FVVEhfVFlQRWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYnJhbmRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoaXMgaW5zdGl0dXRpb24gd2FzIG1hdGNoZWQsIHdoaWNoIHdpbGwgYmUgZWl0aGVyIGByZXR1cm5pbmdfdXNlcmAgb3IgYHJvdXRpbmdfbnVtYmVyYC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1hdGNoX3JlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgc3VibWl0dGVkIGJ5IHVzZXIgYXQgdGhlIG1pY3JvLWRlcG9zaXRzIHJvdXRpbmcgbnVtYmVyIHBhbmUuIEVtaXR0ZWQgYnkgYFNVQk1JVF9ST1VUSU5HX05VTUJFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgbWFzayBleHRyYWN0ZWQgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBhY2NvdW50IG51bWJlci4gSWYgdGhlIHVzZXItaW5wdXR0ZWQgYWNjb3VudCBudW1iZXIgaXMgZm91ciBkaWdpdHMgbG9uZywgYGFjY291bnRfbnVtYmVyX21hc2tgIGlzIGVtcHR5LiBFbWl0dGVkIGJ5IGBTVUJNSVRfQUNDT1VOVF9OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfbWFzaz86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0aGF0IGhhcyBqdXN0IG9jY3VycmVkIGluIHRoZSBMaW5rIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRXZlbnROYW1lIHtcbiAgICBCYW5rSW5jb21lSW5zaWdodHNDb21wbGV0ZWQgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfQ09NUExFVEVEJyxcbiAgICBDbG9zZU9hdXRoID0gJ0NMT1NFX09BVVRIJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgRXhpdCA9ICdFWElUJyxcbiAgICBGYWlsT2F1dGggPSAnRkFJTF9PQVVUSCcsXG4gICAgSGFuZG9mZiA9ICdIQU5ET0ZGJyxcbiAgICBPcGVuID0gJ09QRU4nLFxuICAgIE9wZW5NeVBsYWlkID0gJ09QRU5fTVlfUExBSUQnLFxuICAgIE9wZW5PYXV0aCA9ICdPUEVOX09BVVRIJyxcbiAgICBTZWFyY2hJbnN0aXR1dGlvbiA9ICdTRUFSQ0hfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEF1dGhUeXBlID0gJ1NFTEVDVF9BVVRIX1RZUEUnLFxuICAgIFNlbGVjdEJyYW5kID0gJ1NFTEVDVF9CUkFORCcsXG4gICAgU2VsZWN0RGVncmFkZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfREVHUkFERURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdERvd25JbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRE9XTl9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0RmlsdGVyZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRklMVEVSRURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEluc3RpdHV0aW9uID0gJ1NFTEVDVF9JTlNUSVRVVElPTicsXG4gICAgU3VibWl0QWNjb3VudE51bWJlciA9ICdTVUJNSVRfQUNDT1VOVF9OVU1CRVInLFxuICAgIFN1Ym1pdENyZWRlbnRpYWxzID0gJ1NVQk1JVF9DUkVERU5USUFMUycsXG4gICAgU3VibWl0RG9jdW1lbnRzID0gJ1NVQk1JVF9ET0NVTUVOVFMnLFxuICAgIFN1Ym1pdERvY3VtZW50c0Vycm9yID0gJ1NVQk1JVF9ET0NVTUVOVFNfRVJST1InLFxuICAgIFN1Ym1pdERvY3VtZW50c1N1Y2Nlc3MgPSAnU1VCTUlUX0RPQ1VNRU5UU19TVUNDRVNTJyxcbiAgICBTdWJtaXRNZmEgPSAnU1VCTUlUX01GQScsXG4gICAgU3VibWl0Um91dGluZ051bWJlciA9ICdTVUJNSVRfUk9VVElOR19OVU1CRVInLFxuICAgIFRyYW5zaXRpb25WaWV3ID0gJ1RSQU5TSVRJT05fVklFVycsXG4gICAgVmlld0RhdGFUeXBlcyA9ICdWSUVXX0RBVEFfVFlQRVMnXG59XG5cbi8qKlxuICogQ29udGFpbnMgYSBzdW1tYXJ5IG9mIHRoZSBldmVudHMgZnJvbSBhIGxpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFVkVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGluayBldmVudHMgZW1pdHRlZCBkdXJpbmcgdGhlIGxpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50czogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgbGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIGxpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgYXJlIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua19jb3JyZWxhdGlvbl9pZGAgZnJvbSBhIHJlY2VpdmVkIE9BdXRoIHJlZGlyZWN0IFVSSSBjYWxsYmFja1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2NvcnJlbGF0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGxpbmtfdG9rZW5gIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmUtaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25FeGl0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbmV4aXQpIGNhbGxiYWNrIGZyb20gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIGlmIGEgdXNlciBleGl0cyBMaW5rIHdpdGhvdXQgc3VjY2Vzc2Z1bGx5IGxpbmtpbmcgYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb2ludCBhdCB3aGljaCB0aGUgdXNlciBleGl0ZWQgdGhlIExpbmsgZmxvdy4gT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgU3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBXZWxscyBGYXJnb2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgY29tcGxldGVkIExpbmsgc2Vzc2lvbiwgYWxvbmcgd2l0aCB0aGUgcHVibGljIHRva2VuIGlmIGF2YWlsYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYExJTktgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU0VTU0lPTl9GSU5JU0hFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5hbCBzdGF0dXMgb2YgdGhlIExpbmsgc2Vzc2lvbi4gV2lsbCBhbHdheXMgYmUgXFxcIlNVQ0NFU1NcXFwiIG9yIFxcXCJFWElURURcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGluayB0b2tlbiB1c2VkIHRvIGNyZWF0ZSB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvblN1Y2Nlc3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uc3VjY2VzcykgY2FsbGJhY2sgZnJvbSBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2VzcyB7XG4gICAgLyoqXG4gICAgICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBEaXNwbGF5ZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBgYWNjb3VudHNgIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9zdGF0dXM/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKC9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gc3RhdHVzLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgbnVsbGA6IG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkIGZvciB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gaXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBcXCdXZWxscyBGYXJnb1xcJ2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHRyYW5zZmVyLiBSZXR1cm5lZCBvbmx5IHdoZW4gW1RyYW5zZmVyIFVJXSgvZG9jcy90cmFuc2Zlci91c2luZy10cmFuc2Zlci11aSkgaXMgaW1wbGVtZW50ZWQuICAtIGBDT01QTEVURWAg4oCTIFRoZSB0cmFuc2ZlciB3YXMgY29tcGxldGVkLiAtIGBJTkNPTVBMRVRFYCDigJMgVGhlIHRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIEZvciBoZWxwLCBzZWUgW1Ryb3VibGVzaG9vdGluZyB0cmFuc2ZlcnNdKC9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpI3Ryb3VibGVzaG9vdGluZy10cmFuc2ZlcnMpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1cyB7XG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnLFxuICAgIEluY29tcGxldGUgPSAnSU5DT01QTEVURSdcbn1cblxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgcHJvdmlkZSBsaW1pdGVkIGFjY291bnQgZmlsdGVyaW5nOiBpdCB3aWxsIG9ubHkgZGlzcGxheSBJbnN0aXR1dGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCwgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWNjb3VudHMgb3RoZXIgdGhhbiBgY2hlY2tpbmdgIGFuZCBgc2F2aW5nc2AgYWNjb3VudHMgb24gdGhlIEFjY291bnQgU2VsZWN0IHBhbmUuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIFRoZSBmaWx0ZXIgbWF5IG9yIG1heSBub3QgaW1wYWN0IHRoZSBsaXN0IG9mIGFjY291bnRzIHNob3duIGJ5IHRoZSBpbnN0aXR1dGlvbiBpbiB0aGUgT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyBpbnN0aXR1dGlvbi4gSWYgdGhlIHVzZXIgc2VsZWN0cyBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzIGluIHRoZSBPQXV0aCBmbG93LCB0aGVzZSBhY2NvdW50cyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgSXRlbS4gSWYgdGhlIHVzZXIgc2VsZWN0cyBvbmx5IGV4Y2x1ZGVkIGFjY291bnQgc3VidHlwZXMsIHRoZSBsaW5rIGF0dGVtcHQgd2lsbCBmYWlsIGFuZCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHRyeSBhZ2Fpbi4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBJbnZlc3RtZW50RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdGhlckZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBvdGhlcj86IE90aGVyRmlsdGVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdG8gcGFzcyBpbiBmb3IgdGhlIENhcmQgU3dpdGNoIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2gge1xuICAgIC8qKlxuICAgICAqIFRoZSBCSU4gKEJhbmsgSWRlbnRpZmljYXRpb24gTnVtYmVyKSBvZiB0aGUgY2FyZCB0byBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaFxuICAgICAqL1xuICAgIGNhcmRfYmluOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxDcmVkaXRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgSG9zdGVkIExpbmsgKGJldGEpLiBPbmx5IGF2YWlsYWJsZSBmb3IgcGFydGljaXBhbnRzIGluIHRoZSBIb3N0ZWQgTGluayBiZXRhIHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmsge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgZGVsaXZlcnlfbWV0aG9kPzogSG9zdGVkTGlua0RlbGl2ZXJ5TWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFVSSSB0aGF0IEhvc3RlZCBMaW5rIHdpbGwgcmVkaXJlY3QgdG8gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBMaW5rIGZsb3cuIFRoaXMgd2lsbCBvbmx5IG9jY3VyIGluIEhvc3RlZCBMaW5rIHNlc3Npb25zLCBub3QgaW4gb3RoZXIgaW1wbGVtZW50YXRpb24gbWV0aG9kcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGNvbXBsZXRpb25fcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IHNlY29uZHMgdGhlIGxpbmsgd2lsbCBiZSB2YWxpZCBmb3IuIE11c3QgYmUgcG9zaXRpdmUuIENhbm5vdCBiZSBsb25nZXIgdGhhbiAyMSBkYXlzLiBUaGUgZGVmYXVsdCBsaWZldGltZSBpcyA0IGhvdXJzLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgdXJsX2xpZmV0aW1lX3NlY29uZHM/OiBudW1iZXI7XG59XG4vKipcbiAqIEEgbWFwIGNvbnRhaW5pbmcgZGF0YSB1c2VkIHRvIGhpZ2hsaWdodCBpbnN0aXR1dGlvbnMgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3V0aW5nIG51bWJlciBvZiB0aGUgYmFuayB0byBoaWdobGlnaHQgaW4gTGluay4gTm90ZTogaW4gcmFyZSBjYXNlcywgYSBzaW5nbGUgcm91dGluZyBudW1iZXIgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtdWx0aXBsZSBpbnN0aXR1dGlvbnMsIGUuZy4gZHVlIHRvIGEgYnJva2VyYWdlIHVzaW5nIGFub3RoZXIgaW5zdGl0dXRpb24gdG8gbWFuYWdlIEFDSCBvbiBpdHMgc3dlZXAgYWNjb3VudHMuIElmIHRoaXMgaGFwcGVucywgdGhlIGJhbmsgd2lsbCBub3QgYmUgaGlnaGxpZ2h0ZWQgaW4gTGluayBldmVuIGlmIHRoZSByb3V0aW5nIG51bWJlciBpcyBwcm92aWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwbGljYXRpb24sIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gTGluay4gTWF4aW11bSBsZW5ndGggb2YgMzAgY2hhcmFjdGVycy4gSWYgYSB2YWx1ZSBsb25nZXIgdGhhbiAzMCBjaGFyYWN0ZXJzIGlzIHByb3ZpZGVkLCBMaW5rIHdpbGwgZGlzcGxheSBcXFwiVGhpcyBBcHBsaWNhdGlvblxcXCIgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFuZ3VhZ2UgdGhhdCBMaW5rIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4uIFdoZW4gaW5pdGlhbGl6aW5nIHdpdGggSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB0aGlzIGZpZWxkIGlzIG5vdCB1c2VkOyBmb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0lkZW50aXR5IFZlcmlmaWNhdGlvbiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vI3N1cHBvcnRlZC1sYW5ndWFnZXMpLiAgU3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IC0gRGFuaXNoIChgXFwnZGFcXCdgKSAtIER1dGNoIChgXFwnbmxcXCdgKSAtIEVuZ2xpc2ggKGBcXCdlblxcJ2ApIC0gRXN0b25pYW4gKGBcXCdldFxcJ2ApIC0gRnJlbmNoIChgXFwnZnJcXCdgKSAtIEdlcm1hbiAoYFxcJ2RlXFwnYCkgLSBJdGFsaWFuIChgXFwnaXRcXCdgKSAtIExhdHZpYW4gKGBcXCdsdlxcJ2ApIC0gTGl0aHVhbmlhbiAoYFxcJ2x0XFwnYCkgLSBOb3J3ZWdpYW4gKGBcXCdub1xcJ2ApIC0gUG9saXNoIChgXFwncGxcXCdgKSAtIFBvcnR1Z3Vlc2UgKGBcXCdwdFxcJ2ApIC0gUm9tYW5pYW4gKGBcXCdyb1xcJ2ApIC0gU3BhbmlzaCAoYFxcJ2VzXFwnYCkgLSBTd2VkaXNoIChgXFwnc3ZcXCdgKSAgV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyZWQgaGVyZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5nIGluIHRoZSBjdXN0b21pemF0aW9uLCBvciB0aGUgY3VzdG9taXphdGlvbiB3aWxsIG5vdCBiZSBhcHBsaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2YgUGxhaWQtc3VwcG9ydGVkIGNvdW50cnkgY29kZXMgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluc3RpdHV0aW9ucyBmcm9tIGFsbCBsaXN0ZWQgY291bnRyaWVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGNvbXBsZXRlIG1hcHBpbmcgb2Ygc3VwcG9ydGVkIHByb2R1Y3RzIGJ5IGNvdW50cnksIHNlZSBodHRwczovL3BsYWlkLmNvbS9nbG9iYWwvLiAgSWYgdXNpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCBgY291bnRyeV9jb2Rlc2Agc2hvdWxkIGJlIHNldCB0byB0aGUgY291bnRyeSB3aGVyZSB5b3VyIGNvbXBhbnkgaXMgYmFzZWQsIG5vdCB0aGUgY291bnRyeSB3aGVyZSB5b3VyIHVzZXIgaXMgbG9jYXRlZC4gRm9yIGFsbCBvdGhlciBwcm9kdWN0cywgYGNvdW50cnlfY29kZXNgIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHlvdXIgdXNlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgSWYgTGluayBpcyBsYXVuY2hlZCB3aXRoIG11bHRpcGxlIGNvdW50cnkgY29kZXMsIG9ubHkgcHJvZHVjdHMgdGhhdCB5b3UgYXJlIGVuYWJsZWQgZm9yIGluIGFsbCBjb3VudHJpZXMgd2lsbCBiZSB1c2VkIGJ5IExpbmsuIE5vdGUgdGhhdCB3aGlsZSBhbGwgY291bnRyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gU2FuZGJveCBhbmQgRGV2ZWxvcG1lbnQsIGluIFByb2R1Y3Rpb24gb25seSBVUyBhbmQgQ2FuYWRhIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEFjY2VzcyB0byBFdXJvcGVhbiBpbnN0aXR1dGlvbnMgcmVxdWlyZXMgYWRkaXRpb25hbCBjb21wbGlhbmNlIHN0ZXBzLiBUbyByZXF1ZXN0IGFjY2VzcyB0byBFdXJvcGVhbiBpbnN0aXR1dGlvbnMgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIFtmaWxlIGEgcHJvZHVjdCBhY2Nlc3MgU3VwcG9ydCB0aWNrZXRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9yZXF1ZXN0LXByb2R1Y3QtYWNjZXNzKSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC4gSWYgeW91IGluaXRpYWxpemUgd2l0aCBhIEV1cm9wZWFuIGNvdW50cnkgY29kZSwgeW91ciB1c2VycyB3aWxsIHNlZSB0aGUgRXVyb3BlYW4gY29uc2VudCBwYW5lbCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gIElmIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCBtYWtlIHN1cmUgdGhlIGNvdW50cnkgY29kZXMgaW4gdGhlIGN1c3RvbWl6YXRpb24gbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIGluIGBjb3VudHJ5X2NvZGVzYCwgb3IgdGhlIGN1c3RvbWl6YXRpb24gbWF5IG5vdCBiZSBhcHBsaWVkLiAgSWYgdXNpbmcgdGhlIEF1dGggZmVhdHVyZXMgSW5zdGFudCBNYXRjaCwgU2FtZS1kYXkgTWljcm8tZGVwb3NpdHMsIG9yIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cywgYGNvdW50cnlfY29kZXNgIG11c3QgYmUgc2V0IHRvIGBbXFwnVVNcXCddYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byB1c2UuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZCAodW5sZXNzIHlvdSBhcmUgdXNpbmcgdXBkYXRlIG1vZGUgdG8gYWRkIEluY29tZSBvciBBc3NldHMgdG8gYW4gSXRlbSk7IHJlcXVpcmVkIG90aGVyd2lzZS4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbml0aWFsaXplZCB3aGVuIGFueSBvdGhlciBwcm9kdWN0IGlzIGluaXRpYWxpemVkLiAgVGhlIHByb2R1Y3RzIHNwZWNpZmllZCBoZXJlIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIGluc3RpdHV0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3VyIHVzZXJzIGluIExpbmsuIE9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCAqYWxsKiByZXF1ZXN0ZWQgcHJvZHVjdHMgY2FuIGJlIHNlbGVjdGVkOyBhIGlmIGEgdXNlciBhdHRlbXB0cyB0byBzZWxlY3QgYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEgbGlzdGVkIHByb2R1Y3QsIGEgXFxcIkNvbm5lY3Rpdml0eSBub3Qgc3VwcG9ydGVkXFxcIiBlcnJvciBtZXNzYWdlIHdpbGwgYXBwZWFyIGluIExpbmsuIFRvIG1heGltaXplIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSwgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIG1pbmltYWwgcHJvZHVjdCBzZXQgcmVxdWlyZWQgZm9yIHlvdXIgdXNlIGNhc2UuIEFkZGl0aW9uYWwgcHJvZHVjdHMgY2FuIGJlIGluY2x1ZGVkIHZpYSB0aGUgW2BvcHRpb25hbF9wcm9kdWN0c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1vcHRpb25hbC1wcm9kdWN0cykgb3IgIFtgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXJlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykgZmllbGRzLCBvciBjYW4gYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB0aGUgZW5kcG9pbnQgYWZ0ZXIgb2J0YWluaW5nIGFuIGFjY2VzcyB0b2tlbi4gRm9yIGRldGFpbHMgYW5kIGV4Y2VwdGlvbnMsIHNlZSBbQ2hvb3Npbmcgd2hlbiB0byBpbml0aWFsaXplIHByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLykuICBOb3RlIHRoYXQsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCB0byBkaXNhYmxlIEluc3RhbnQgTWF0Y2ggc3VwcG9ydCwgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IE1hdGNoIHdpbGwgYWxzbyBiZSBzaG93biBpbiBMaW5rIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBldmVuIHRob3VnaCB0aGVzZSBpbnN0aXR1dGlvbnMgZG8gbm90IGNvbnRhaW4gYGF1dGhgIGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuICBJbiBQcm9kdWN0aW9uLCB5b3Ugd2lsbCBiZSBiaWxsZWQgZm9yIGVhY2ggcHJvZHVjdCB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE5vdGUgdGhhdCBhIHByb2R1Y3QgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSBhbiBJdGVtIG9uY2UgdGhlIEl0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IHByb2R1Y3QuIFRvIHN0b3AgYmlsbGluZyBvbiBhbiBJdGVtIGZvciBzdWJzY3JpcHRpb24tYmFzZWQgcHJvZHVjdHMsIHN1Y2ggYXMgTGlhYmlsaXRpZXMsIEludmVzdG1lbnRzLCBhbmQgVHJhbnNhY3Rpb25zLCByZW1vdmUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZSBvbmx5IGlmIHRoZSBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudChzKSBzZWxlY3RlZCBieSB0aGUgdXNlciBzdXBwb3J0IHRoZSBwcm9kdWN0LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIHN0aWxsIGJlIHNob3duIGluIExpbmsuIFRoZSBwcm9kdWN0cyB3aWxsIG9ubHkgYmUgZXh0cmFjdGVkIGFuZCBiaWxsZWQgaWYgdGhlIHVzZXIgc2VsZWN0cyBhbiBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudCB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlbS4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXlzLiBUaGUgYHByb2R1Y3RzYCBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHByb2R1Y3QuICBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoaXMgZmVhdHVyZSwgc2VlIFtSZXF1aXJlZCBpZiBTdXBwb3J0ZWQgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHlvdSBtYXkgd2lzaCB0byB1c2UgYnV0IHRoYXQgYXJlIG5vdCByZXF1aXJlZCBmb3IgeW91ciB1c2UgY2FzZS4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGZldGNoIGRhdGEgZm9yIHRoZXNlIHByb2R1Y3RzIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMsIGFuZCBmYWlsdXJlIHRvIHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYWZmZWN0IEl0ZW0gY3JlYXRpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW09wdGlvbmFsIFByb2R1Y3RzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jb3B0aW9uYWwtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25hbF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogKEJldGEpIFRoaXMgZmllbGQgaGFzIG5vIGVmZmVjdCB1bmxlc3MgeW91IGFyZSBwYXJ0aWNpcGF0aW5nIGluIHRoZSBbRGF0YSBUcmFuc3BhcmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKSBiZXRhIHByb2dyYW0uIExpc3Qgb2YgYWRkaXRpb25hbCBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIGNvbGxlY3QgY29uc2VudCBmb3IuIFRoZXNlIHByb2R1Y3RzIHdpbGwgbm90IGJlIGJpbGxlZCB1bnRpbCB5b3Ugc3RhcnQgdXNpbmcgdGhlbSBieSBjYWxsaW5nIHRoZSByZWxldmFudCBlbmRwb2ludHMuICBgYmFsYW5jZWAgaXMgKm5vdCogYSB2YWxpZCB2YWx1ZSwgdGhlIEJhbGFuY2UgcHJvZHVjdCBkb2VzIG5vdCByZXF1aXJlIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBjb25zZW50IGNvbGxlY3RlZC4gIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2Agb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXlzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCBhbnkgd2ViaG9va3Mgc2hvdWxkIGJlIHNlbnQuIE5vdGUgdGhhdCB3ZWJob29rcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIChlLXdhbGxldCB0cmFuc2FjdGlvbnMgb25seSksIFRyYW5zZmVyLCBCYW5rIFRyYW5zZmVyIChpbmNsdWRpbmcgQXV0aCBtaWNyby1kZXBvc2l0IG5vdGlmaWNhdGlvbiB3ZWJob29rcykgYW5kIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhcmUgY29uZmlndXJlZCB2aWEgdGhlIERhc2hib2FyZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gdG8gdXBkYXRlIG9yIHJlZmVyZW5jZSwgdXNlZCB3aGVuIHVwZGF0aW5nLCBtb2RpZnlpbmcsIG9yIGFjY2Vzc2luZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYC4gVXNlZCB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCB3aGVuIGNvbXBsZXRpbmcgdGhlIFNhbWUtZGF5IChtYW51YWwpIE1pY3JvLWRlcG9zaXQgZmxvdywgb3IgKG9wdGlvbmFsbHkpIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsgZm9yIGEgcmV0dXJuaW5nIHVzZXIgYXMgcGFydCBvZiB0aGUgVHJhbnNmZXIgVUkgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW1zIHRvIHVwZGF0ZSBpbiBMaW5rIHVwZGF0ZSBtb2RlIGZvciB0aGUgQXNzZXRzIHByb2R1Y3QuIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiB0aGUgYGFjY2Vzc190b2tlbmAgZmllbGQgYWxsb3dzIHRoZSB1cGRhdGluZyBvZiBtdWx0aXBsZSBpdGVtcyBhdCBvbmNlLiBUaGlzIGZlYXR1cmUgaXMgaW4gY2xvc2VkIGJldGEsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm8uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgTGluayBjdXN0b21pemF0aW9uIGZyb20gdGhlIFBsYWlkIERhc2hib2FyZCB0byBiZSBhcHBsaWVkIHRvIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBgZGVmYXVsdGAgY3VzdG9taXphdGlvbiB3aWxsIGJlIHVzZWQuIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBpbiB0aGUgY3VzdG9taXphdGlvbiBtdXN0IG1hdGNoIHRoZSBsYW5ndWFnZSBzZWxlY3RlZCB2aWEgdGhlIGBsYW5ndWFnZWAgcGFyYW1ldGVyLCBhbmQgdGhlIGNvdW50cmllcyBpbiB0aGUgY3VzdG9taXphdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGNvdW50cnkgY29kZXMgc2VsZWN0ZWQgdmlhIGBjb3VudHJ5X2NvZGVzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jdXN0b21pemF0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkkgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24gd2hlcmUgYSB1c2VyIHNob3VsZCBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciB2aWEgYSB3ZWJ2aWV3LiBUaGUgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIG5vdCBjb250YWluIGFueSBxdWVyeSBwYXJhbWV0ZXJzLiBXaGVuIHVzZWQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCwgbXVzdCBiZSBhbiBodHRwcyBVUkkuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gTm90ZSB0aGF0IGFueSByZWRpcmVjdCBVUkkgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgbGlzdCBpbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIElmIGluaXRpYWxpemluZyBvbiBBbmRyb2lkLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgc3BlY2lmaWVkIGluc3RlYWQgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSBsZWZ0IGJsYW5rLiBJZiB1c2luZyBIb3N0ZWQgTGluayAoYmV0YSkgdGhlIGByZWRpcmVjdF91cmlgIG11c3QgYmUgc2V0IHRvIGBodHRwczovL2hvc3RlZC5wbGFpZC5jb20vb2F1dGgvcmVkaXJlY3RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBcXCdzIEFuZHJvaWQgcGFja2FnZS4gUmVxdWlyZWQgaWYgdXNpbmcgdGhlIGBsaW5rX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgb24gQW5kcm9pZC4gQW55IHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaGVyZSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgQW5kcm9pZCBwYWNrYWdlIG5hbWVzIHNldHRpbmcgb24gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBXaGVuIGNyZWF0aW5nIGEgYGxpbmtfdG9rZW5gIGZvciBpbml0aWFsaXppbmcgTGluayBvbiBvdGhlciBwbGF0Zm9ybXMsIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgbXVzdCBiZSBsZWZ0IGJsYW5rIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbmRyb2lkX3BhY2thZ2VfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhcmRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQWNjb3VudEZpbHRlcnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBMaW5rVG9rZW5BY2NvdW50RmlsdGVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuRVVDb25maWd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldV9jb25maWc/OiBMaW5rVG9rZW5FVUNvbmZpZztcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBjZXJ0YWluIEV1cm9wZS1vbmx5IGNvbmZpZ3VyYXRpb25zLCBhcyB3ZWxsIGFzIGNlcnRhaW4gbGVnYWN5IHVzZSBjYXNlcyBpbiBvdGhlciByZWdpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2g7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFzZV9yZXBvcnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZT86IENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGg/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXI/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1cGRhdGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzO1xuICAgIC8qKlxuICAgICAqIEEgdXNlciB0b2tlbiBnZW5lcmF0ZWQgdXNpbmcgYC91c2VyL2NyZWF0ZWAuIEFueSBJdGVtIGNyZWF0ZWQgZHVyaW5nIHRoZSBMaW5rIHNlc3Npb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBMaW5rVG9rZW5JbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuSW52ZXN0bWVudHNBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfYXV0aD86IExpbmtUb2tlbkludmVzdG1lbnRzQXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGhvc3RlZF9saW5rPzogTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGluaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogTGlua1Rva2VuVHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgcmVxdWVzdCBhIENSQSBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JhX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgb25seSBkaXNwbGF5IGFjY291bnQgdHlwZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuICBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBGb3IgaW5zdGl0dXRpb25zIHVzaW5nIE9BdXRoLCB0aGUgZmlsdGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgbGlzdCBvZiBpbnN0aXR1dGlvbnMgb3IgYWNjb3VudHMgc2hvd24gYnkgdGhlIGJhbmsgaW4gdGhlIE9BdXRoIHdpbmRvdy4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGNyZWRpdD86IExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGxvYW4/OiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEF1dGggcHJvZHVjdC4gVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBleHRlbmRlZCBBdXRoIGZsb3dzIGZvciB0aGUgcmVzdWx0aW5nIExpbmsgc2Vzc2lvbi4gT21pdHRpbmcgYW55IGZpZWxkIHdpbGwgcmVzdWx0IGluIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGgge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIEF1dGggVHlwZSBTZWxlY3QgaXMgZW5hYmxlZCBmb3IgdGhlIExpbmsgc2Vzc2lvbiwgYWxsb3dpbmcgdGhlIGVuZCB1c2VyIHRvIGNob29zZSBiZXR3ZWVuIGxpbmtpbmcgaW5zdGFudGx5IG9yIG1hbnVhbGx5IHByaW9yIHRvIHNlbGVjdGluZyB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCB0aGlzIGNhbiBvbmx5IGJlIHRydWUgaWYgYHNhbWVfZGF5X21pY3JvZGVwb3NpdHNfZW5hYmxlZGAgaXMgc2V0IHRvIHRydWUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0aF90eXBlX3NlbGVjdF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBhdXRvbWF0ZWRfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBJbnN0YW50IE1hdGNoIGZsb3cuIEFzIG9mIE5vdmVtYmVyIDIwMjIsIEluc3RhbnQgTWF0Y2ggd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEluc3RhbnQgTWF0Y2ggY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhpcyBmaWVsZCB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBzYW1lX2RheV9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWljcm8tZGVwb3NpdHMgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBpbnN0YW50X21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoYXQgdHlwZSBvZiBbUmVyb3V0ZSB0byBDcmVkZW50aWFsc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3NhbWUtZGF5LyNyZXJvdXRlLXRvLWNyZWRlbnRpYWxzKSBwYW5lIHNob3VsZCBiZSB1c2VkIGluIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSBTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93LiBBcyBvZiBPY3RvYmVyIDE1IDIwMjMsIHRoZSBkZWZhdWx0IHNldHRpbmcgaXMgYE9QVElPTkFMYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHJlcm91dGVfdG9fY3JlZGVudGlhbHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBEYXRhYmFzZSBNYXRjaCBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGRhdGFiYXNlX21hdGNoX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgYXV0aF90eXBlX3NlbGVjdF9lbmFibGVkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZmxvd190eXBlPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhGbG93VHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhSZXJvdXRlVG9DcmVkZW50aWFsc0VudW0ge1xuICAgIE9mZiA9ICdPRkYnLFxuICAgIE9wdGlvbmFsID0gJ09QVElPTkFMJyxcbiAgICBGb3JjZWQgPSAnRk9SQ0VEJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bSB7XG4gICAgRmxleGlibGVBdXRoID0gJ0ZMRVhJQkxFX0FVVEgnXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQmFzZSBSZXBvcnQgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgYXNzZXRzYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgdGhlIGNsaWVudCBpcyBDUkEtZW5hYmxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBEZXBvc2l0IFN3aXRjaCAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZGVwb3NpdF9zd2l0Y2hgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2gge1xuICAgIC8qKlxuICAgICAqIFRoZSBgZGVwb3NpdF9zd2l0Y2hfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2hcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBFbXBsb3ltZW50IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95bWVudF9zb3VyY2VfdHlwZXM/OiBBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWU7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggQmFuayBFbXBsb3ltZW50LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgZW1wbG95bWVudF9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb24gZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb25zZW50PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBJbmNvbWUgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgb2YgdGhlIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSwgYXMgcHJvdmlkZWQgYnkgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgb2YgYW4gYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgYXMgcHJvdmlkZWQgYnkgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gUHJvdmlkaW5nIGFuIGBhc3NldF9yZXBvcnRfaWRgIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHVzZXIgdGhyb3VnaCBhIHN0cmVhbWxpbmVkIGZsb3cuIElmIHByb3ZpZGVkLCB0aGUgYmFuayBsaW5raW5nIGZsb3cgd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIHRoYXQgYSB1c2VyIGhhcyBwcmV2aW91c2x5IGNvbm5lY3RlZCB3aXRoLiBEYXRhIGZyb20gdGhlc2UgaW5zdGl0dXRpb25zIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIGRvY3VtZW50IGRhdGEgcmVjZWl2ZWQgZHVyaW5nIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBoZWxwIHZlcmlmeSB0aGF0IHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgYXJlIGFjY3VyYXRlLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGVzZSBJdGVtcyBkdXJpbmcgbGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi4gIFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgcGF5cm9sbGAgaW5jb21lIHNvdXJjZSB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdGVkX2luY29tZV9zb3VyY2VzPzogQXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIEJhbmsgSW5jb21lLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgSW5jb21lIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgbXVsdGlwbGUgSXRlbXMgdG8gYmUgYWRkZWQgaW4gdGhlIExpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGVuYWJsZV9tdWx0aXBsZV9pdGVtcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIFBheXJvbGwgSW5jb21lIChpbmNsdWRpbmcgRG9jdW1lbnQgSW5jb21lKS4gRnVydGhlciBjdXN0b21pemF0aW9uIG9wdGlvbnMgZm9yIERvY3VtZW50IEluY29tZSwgc3VjaCBhcyBjdXN0b21pemluZyB3aGljaCBkb2N1bWVudCB0eXBlcyBtYXkgYmUgdXBsb2FkZWQsIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFtMaW5rIEN1c3RvbWl6YXRpb24gcGFuZV0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2xpbmspIGluIHRoZSBEYXNoYm9hcmQuIChSZXF1aXJlcyBQcm9kdWN0aW9uIGVuYWJsZW1lbnQuKVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gdG8gZW5hYmxlIGZvciB0aGUgTGluayBzZXNzaW9uLiBJZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlcnMgd2lsbCBzZWUgYm90aCBkb2N1bWVudCBhbmQgZGlnaXRhbCBwYXlyb2xsIGluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBmbG93X3R5cGVzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIExpbmsgdG9rZW4gd2lsbCBiZSB1c2VkIGZvciB1cGRhdGUgbW9kZS4gVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBpc191cGRhdGVfbW9kZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBJdGVtIHRvIHVwZGF0ZSB3aXRoLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGl0ZW1faWRfdG9fdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2YgYW5hbHlzaXMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCB1cGxvYWRzLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBkb2NzIHdpbGwgdW5kZXJnbyBPQ1IgcGFyc2luZyBvbmx5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBwYXJzaW5nX2NvbmZpZz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+IHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHBheW1lbnRfaW5pdGlhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuIEVpdGhlciBgcGF5bWVudF9pZGAgb3IgYGNvbnNlbnRfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgU3RhdGVtZW50cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIGZvciBzdGF0ZW1lbnRzLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSDigJxZWVlZLU1NLURE4oCdIGZvcm1hdCwgZS5nLiBcXFwiMjAyMC0xMC0zMFxcXCIuIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byAzIG1vbnRocyBwcmlvciB0byB0aGUgY3VycmVudCBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIwLTEwLTMwXFxcIi4gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBjdXJyZW50IGRhdGUuIFlvdSBjYW4gcmVxdWVzdCB1cCB0byB0d28geWVhcnMgb2YgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBUcmFuc2ZlciBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCByZXR1cm5lZCBieSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGVuYWJsZXMgW3VwZGF0ZSBtb2RlIHdpdGggQWNjb3VudCBTZWxlY3RdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8jdXNpbmctdXBkYXRlLW1vZGUtdG8tcmVxdWVzdC1uZXctYWNjb3VudHMpIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgdXNlIE9BdXRoLCBvciB0aGF0IHVzZSBPQXV0aCBidXQgZG8gbm90IGhhdmUgdGhlaXIgb3duIGFjY291bnQgc2VsZWN0aW9uIGZsb3cuIEZvciBpbnN0aXR1dGlvbnMgdGhhdCBoYXZlIGFuIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3cgKGkuZS4gbW9zdCBPQXV0aC1lbmFibGVkIGluc3RpdHV0aW9ucyksIHVwZGF0ZSBtb2RlIHdpdGggQWNjb3VudCBTZWxlY3Qgd2lsbCBhbHdheXMgYmUgZW5hYmxlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfc2VsZWN0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgd2hvIHdpbGwgYmUgbGlua2luZyB0aGVpciBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIuIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgYSB1c2VyIElEIG51bWJlciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuIEl0IGlzIGN1cnJlbnRseSB1c2VkIGFzIGEgbWVhbnMgb2Ygc2VhcmNoaW5nIGxvZ3MgZm9yIHRoZSBnaXZlbiB1c2VyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUsIHVzZWQgZm9yIFttaWNyby1kZXBvc2l0IGJhc2VkIHZlcmlmaWNhdGlvbiBmbG93c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuIEZvciBhIHNtYWxsIG51bWJlciBvZiBjdXN0b21lcnMgb24gbGVnYWN5IGZsb3dzLCBwcm92aWRpbmcgdGhpcyBmaWVsZCBpcyByZXF1aXJlZCB0byBlbmFibGUgbWljcm8tZGVwb3NpdC1iYXNlZCBmbG93cy4gRm9yIGFsbCBvdGhlciBjdXN0b21lcnMsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCBwcm92aWRpbmcgdGhlIHVzZXJcXCdzIG5hbWUgaW4gdGhpcyBmaWVsZCB3aGVuIHVzaW5nIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIHdpbGwgZW5hYmxlIGNlcnRhaW4gcmlzayBjaGVja3MgYW5kIGNhbiByZWR1Y2UgbWljcm8tZGVwb3NpdCBmcmF1ZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyIGluIFtFLjE2NF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRS4xNjQpIGZvcm1hdC4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCByZXF1aXJlZCB0byBlbmFibGUgdGhlIFtwcmUtYXV0aGVudGljYXRlZCByZXR1cm5pbmcgdXNlciBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIvI3ByZS1hdXRoZW50aWNhdGVkLXJ1eCkuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBlbWFpbCBhZGRyZXNzIHdhcyB2ZXJpZmllZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGlzIHdhcyBwcmV2aW91c2x5IGFuIG9wdGlvbmFsIGZpZWxkIHVzZWQgaW4gdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLiBUaGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBlbmFibGUgdGhlIHJldHVybmluZyB1c2VyIGV4cGVyaWVuY2UuICAgT25seSBwYXNzIGEgdmVyaWZpY2F0aW9uIHRpbWUgZm9yIGFuIGVtYWlsIGFkZHJlc3MgdGhhdCB5b3UgaGF2ZSB2ZXJpZmllZC4gSWYgeW91IGhhdmUgcGVyZm9ybWVkIHZlcmlmaWNhdGlvbiBidXQgZG9u4oCZdCBoYXZlIHRoZSB0aW1lLCB5b3UgbWF5IHN1cHBseSBhIHNpZ25hbCB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIFVOSVggZXBvY2guICAgRXhhbXBsZTogYDIwMjAtMDEtMDFUMDA6MDA6MDBaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzX3ZlcmlmaWVkX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgYW5kIG5vdCBjdXJyZW50bHkgdXNlZCwgdXNlIHRoZSBgaWRfbnVtYmVyYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuIENhbiBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGlkX251bWJlcj86IFVzZXJJRE51bWJlcjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHVzZXIgc3RhdGVkIGluY29tZSBzb3VyY2VzIGZvciB0aGUgSW5jb21lIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgY29ycmVzcG9uZGluZyB0byBhbiBpbmNvbWUgc291cmNlIHNwZWNpZmllZCBieSB0aGUgdXNlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIHBlciBjeWNsZSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X3Blcl9jeWNsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIGFubnVhbGx5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfYW5udWFsPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfdHlwZT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5O1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgbGlua190b2tlbmAgY3JlYXRlZCB0byBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIHRoYXQgd2lsbCBiZSBleGNoYW5nZWQgZm9yIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgNCBob3Vycy4gQSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIG9mIGEgUGxhaWQtaG9zdGVkIExpbmsgZmxvdyB0aGF0IHdpbGwgdXNlIHRoZSBMaW5rIHRva2VuIHJldHVybmVkIGJ5IHRoaXMgcmVxdWVzdC4gT25seSBwcmVzZW50IGlmIHRoZSBjbGllbnQgaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsgKGJldGEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaG9zdGVkX2xpbmtfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5FVUNvbmZpZyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBvcGVuIExpbmsgd2l0aG91dCBhbiBpbml0aWFsIFVJLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5FVUNvbmZpZ1xuICAgICAqL1xuICAgIGhlYWRsZXNzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50cyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWN0c2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGB3ZWJob29rYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb3VudHJ5X2NvZGVzYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGxhbmd1YWdlYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9kYXRhPzogTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50RmlsdGVyc1Jlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogQWNjb3VudEZpbHRlcnNSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlZGlyZWN0X3VyaWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfbmFtZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGluay90b2tlbi9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX3Rva2VuYCwgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIHRvIExpbmsgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBpdCBhbmQgcmVjZWl2ZSBhIGBwdWJsaWNfdG9rZW5gLCB3aGljaCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBMaW5rIHNlc3Npb25zIGNyZWF0ZWQgdXNpbmcgdGhpcyBgbGlua190b2tlbmAuIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgeW91ciBjbGllbnQgaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsgKGJldGEpLiBTZXNzaW9uIGRhdGEgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXAgdG8gc2l4IGhvdXJzIGFmdGVyIHRoZSBzZXNzaW9uIGhhcyBlbmRlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19zZXNzaW9ucz86IEFycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBsaW5rIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgeW91ciBjbGllbnQgaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsgKGJldGEpLiBTZXNzaW9uIGRhdGEgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXAgdG8gc2l4IGhvdXJzIGFmdGVyIHRoZSBzZXNzaW9uIGhhcyBlbmRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBsaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmlyc3Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGFydGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmluaXNoZWQsIGlmIGF2YWlsYWJsZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmaW5pc2hlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIG9uX3N1Y2Nlc3M/OiBMaW5rU2Vzc2lvblN1Y2Nlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbl9leGl0PzogTGlua1Nlc3Npb25FeGl0IHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgYWxsb3cgc2VsZi1jdXN0b2R5IGNyeXB0byB3YWxsZXRzIHRvIGJlIGFkZGVkIHdpdGhvdXQgcmVxdWlyaW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWxsb3dfdW52ZXJpZmllZF9jcnlwdG9fd2FsbGV0cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyB1c2VycyB0byBtYW51YWxseSBlbnRlciBJbnZlc3RtZW50cyBhY2NvdW50IGFuZCBob2xkaW5ncyBpbmZvcm1hdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd19tYW51YWxfZW50cnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBJbnZlc3RtZW50cyBBdXRoIFByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGgge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hbnVhbCBlbnRyeSBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYW51YWxfZW50cnlfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hc2tlZCBudW1iZXIgbWF0Y2ggZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgbWFza2VkX251bWJlcl9tYXRjaF9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIGFmdGVyIERlY2VtYmVyIDMsIDIwMjMsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIG9uIERlY2VtYmVyIDMsIDIwMjMgb3IgZWFybGllciwgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA3MzAgZGF5cyB1bnRpbCBKdW5lIDI0LCAyMDI0LCBhdCB3aGljaCBwb2ludCBpdCB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB1dGlsaXppbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5UcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogV2ViaG9vayBpbmRpY2F0aW5nIHRoYXQgdGhlIHN0YXR1cyBvZiB0aGUgZGVsaXZlcnkgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gdG8gYSB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBMSU5LX0RFTElWRVJZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFTElWRVJZX1NUQVRVU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9tZXRhZGF0YTogTGlua0RlbGl2ZXJ5TWV0YWRhdGE7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgbW9ydGdhZ2UgbG9hbiBhZ3JlZW1lbnQgYmV0d2VlbiBvbmUgb3IgbW9yZSBib3Jyb3dlcnMgYW5kIGEgbW9ydGdhZ2UgbGVuZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBMb2FuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgTG9hblxuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUlM6IExvYW5JZGVudGlmaWVycztcbn1cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgbG9hbiBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWxvYW4pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTG9hbkFjY291bnRTdWJ0eXBlIHtcbiAgICBBdXRvID0gJ2F1dG8nLFxuICAgIEJ1c2luZXNzID0gJ2J1c2luZXNzJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIENvbnN0cnVjdGlvbiA9ICdjb25zdHJ1Y3Rpb24nLFxuICAgIENvbnN1bWVyID0gJ2NvbnN1bWVyJyxcbiAgICBIb21lRXF1aXR5ID0gJ2hvbWUgZXF1aXR5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIE1vcnRnYWdlID0gJ21vcnRnYWdlJyxcbiAgICBMaW5lT2ZDcmVkaXQgPSAnbGluZSBvZiBjcmVkaXQnLFxuICAgIFN0dWRlbnQgPSAnc3R1ZGVudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbkZpbHRlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBsb2FuIGJ5IHZhcmlvdXMgcGFydGllcyB0byB0aGUgdHJhbnNhY3Rpb24gb3Igb3RoZXIgb3JnYW5pemF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllclxuICAgICAqL1xuICAgIExvYW5JZGVudGlmaWVyVHlwZTogTG9hbklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGxvYW4gaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExvYW5JZGVudGlmaWVyVHlwZSB7XG4gICAgTGVuZGVyTG9hbiA9ICdMZW5kZXJMb2FuJyxcbiAgICBVbml2ZXJzYWxMb2FuID0gJ1VuaXZlcnNhbExvYW4nXG59XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuSWRlbnRpZmllcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW5JZGVudGlmaWVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJzXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSOiBMb2FuSWRlbnRpZmllcjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGxvYW5zIHRoYXQgYXJlIHBhcnQgb2YgYSBzaW5nbGUgZGVhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvYW5zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW59XG4gICAgICogQG1lbWJlcm9mIExvYW5zXG4gICAgICovXG4gICAgTE9BTjogTG9hbjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9jYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbGF0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbG9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBkZWZpbmVkIHN0b3JlIG51bWJlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBzdG9yZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbXVsdGktZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzIHRvIHVzZSB3aXRoIHRoaXMgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1GQVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTUZBIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSBgZGV2aWNlYCwgYHNlbGVjdGlvbnNgLCBvciBgcXVlc3Rpb25zYC4gIElmIHZhbHVlIGlzIGBkZXZpY2VgLCB0aGUgTUZBIGFuc3dlciBpcyBgMTIzNGAuICBJZiB2YWx1ZSBpcyBgc2VsZWN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzIGFsd2F5cyB0aGUgZmlyc3Qgb3B0aW9uLiAgSWYgdmFsdWUgaXMgYHF1ZXN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzICBgYW5zd2VyXzxpPl88aj5gIGZvciB0aGUgai10aCBxdWVzdGlvbiBpbiB0aGUgaS10aCByb3VuZCwgc3RhcnRpbmcgZnJvbSAwLiBGb3IgZXhhbXBsZSwgdGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaW4gdGhlIHNlY29uZCByb3VuZCBpcyBgYW5zd2VyXzFfMGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2YgcXVlc3Rpb25zLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBxdWVzdGlvbnMgcGVyIHJvdW5kLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIElmIHZhbHVlIG9mIHR5cGUgaXMgYHNlbGVjdGlvbnNgLCBkZWZhdWx0IHZhbHVlIGlzIDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25zX3Blcl9yb3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2Ygc2VsZWN0aW9ucywgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYXZhaWxhYmxlIGFuc3dlcnMgcGVyIHF1ZXN0aW9uLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uYC4gRGVmYXVsdHMgdG8gMi4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uc19wZXJfcXVlc3Rpb246IG51bWJlcjtcbn1cbi8qKlxuICogU3VtbWFyeSBvYmplY3QgcmVmbGVjdGluZyB0aGUgbWF0Y2ggcmVzdWx0IG9mIHRoZSBhc3NvY2lhdGVkIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNYXRjaFN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgTWF0Y2hTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGEgdXNlcuKAmXMgdG9wIG1lcmNoYW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIGlkIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggbWVyY2hhbnQgb2YgdGhpcyB0eXBlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9kZXRhaWxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdW0gb2Ygb3V0ZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBpbmZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93czogbnVtYmVyO1xufVxuLyoqXG4gKiBBbGxvd3Mgc3BlY2lmeWluZyB0aGUgbWV0YWRhdGEgb2YgdGhlIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNZXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNZXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbGltaXRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbWFzay4gU2hvdWxkIGJlIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZyBvZiAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIFRoaXMgYWxsb3dzIHlvdSB0byBtb2RlbCBhIG1hc2sgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGFjY291bnQgbnVtYmVyIChzdWNoIGFzIHdpdGggYSB2aXJ0dWFsIGFjY291bnQgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgaW50ZXJlc3QgcmF0ZSBmb3IgdGhlIG1vcnRnYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnRlcmVzdFJhdGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQZXJjZW50YWdlIHZhbHVlIChpbnRlcmVzdCByYXRlIG9mIGN1cnJlbnQgbW9ydGdhZ2UsIG5vdCBBUFIpIG9mIGludGVyZXN0IHBheWFibGUgb24gYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlcmVzdCBjaGFyZ2VkIChmaXhlZCBvciB2YXJpYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgbW9ydGdhZ2UgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlTGlhYmlsaXR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG91dHN0YW5kaW5nIGFtb3VudCBjaGFyZ2VkIGZvciBsYXRlIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBjdXJyZW50X2xhdGVfZmVlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBoZWxkIGluIGVzY3JvdyB0byBwYXkgdGF4ZXMgYW5kIGluc3VyYW5jZSBvbiBiZWhhbGYgb2YgdGhlIGJvcnJvd2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgZXNjcm93X2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIGhhcyBwcml2YXRlIG1vcnRnYWdlIGluc3VyYW5jZSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3BtaTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIHdpbGwgcGF5IGEgcGVuYWx0eSBmb3IgZWFybHkgcGF5b2ZmIG9mIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wcmVwYXltZW50X3BlbmFsdHk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZUludGVyZXN0UmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlOiBNb3J0Z2FnZUludGVyZXN0UmF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgbG9hbiwgZm9yIGV4YW1wbGUgYGNvbnZlbnRpb25hbGAsIGBmaXhlZGAsIG9yIGB2YXJpYWJsZWAuIFRoaXMgZmllbGQgaXMgcHJvdmlkZWQgZGlyZWN0bHkgZnJvbSB0aGUgbG9hbiBzZXJ2aWNlciBhbmQgZG9lcyBub3QgaGF2ZSBhbiBlbnVtZXJhdGVkIHNldCBvZiBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3R5cGVfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRnVsbCBkdXJhdGlvbiBvZiBtb3J0Z2FnZSBhcyBhdCBvcmlnaW5hdGlvbiAoZS5nLiBgMTAgeWVhcmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90ZXJtOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmFsIGRhdGUgb24gd2hpY2ggbW9ydGdhZ2UgaXMgZHVlIGluIGZ1bGwuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBuZXh0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X21vbnRobHlfcGF5bWVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBsb2FuIChwcmluY2lwYWwgKyBpbnRlcmVzdCkgcGFzdCBkdWUgZm9yIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwYXN0X2R1ZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlUHJvcGVydHlBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHByb3BlcnR5X2FkZHJlc3M6IE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgaW50ZXJlc3QgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9pbnRlcmVzdF9wYWlkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBZVEQgcHJpbmNpcGFsIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZpZWxkcyBkZXNjcmliaW5nIHByb3BlcnR5IGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZml2ZSBvciBuaW5lIGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSAoZXhhbXBsZSBcXFwiTkNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyAoZXhhbXBsZSBcXFwiNTY0IE1haW4gU3RyZWV0LCBBcHQgMTVcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgcmlzayBzaWduYWxzIGFuZCByZWxldmFudCBtZXRhZGF0YSBmb3IgYSBzZXQgb2YgdXBsb2FkZWQgZG9jdW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBhdHRyaWJ1dGVzIHRoYXQgY291bGQgaW5kaWNhdGUgaWYgYSBkb2N1bWVudCBpcyBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge0FycmF5PFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZT59XG4gICAgICogQG1lbWJlcm9mIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZG9jdW1lbnRfcmVmZXJlbmNlczogQXJyYXk8Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBhdHRyaWJ1dGVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlcmUgaXMgZnJhdWQgcmlzayB3aXRoIGEgc2V0IG9mIGRvY3VtZW50c1xuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogU2NvcmUgZm91bmQgYnkgbWF0Y2hpbmcgbmFtZSBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIG5hbWUgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBuYW1lLiAxMDAgaXMgYSBwZXJmZWN0IHNjb3JlLCA5OS04NSBtZWFucyBhIHN0cm9uZyBtYXRjaCwgODQtNzAgaXMgYSBwYXJ0aWFsIG1hdGNoLCBhbnkgc2NvcmUgbGVzcyB0aGFuIDcwIGlzIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgbmFtZSBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogZmlyc3Qgb3IgbGFzdCBuYW1lIGNvbXBsZXRlbHkgbWF0Y2hlZCwgbGlrZWx5IGEgZmFtaWx5IG1lbWJlclxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX2ZpcnN0X25hbWVfb3JfbGFzdF9uYW1lX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogbmlja25hbWUgbWF0Y2hlZCwgZXhhbXBsZSBKZW5uaWZlciBhbmQgSmVubi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19uaWNrbmFtZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElzIGB0cnVlYCBpZiB0aGUgbmFtZSBvbiBlaXRoZXIgb2YgdGhlIG5hbWVzIHRoYXQgd2FzIG1hdGNoZWQgZm9yIHRoZSBzY29yZSBjb250YWluZWQgc3RyaW5ncyBpbmRpY2F0aXZlIG9mIGEgYnVzaW5lc3MgbmFtZSwgc3VjaCBhcyBcXFwiQ09SUFxcXCIsIFxcXCJMTENcXFwiLCBcXFwiSU5DXFxcIiwgb3IgXFxcIkxURFxcXCIuIEEgYHRydWVgIHJlc3VsdCBnZW5lcmFsbHkgaW5kaWNhdGVzIHRoZSBlbnRpdHkgaXMgYSBidXNpbmVzcy4gSG93ZXZlciwgYSBgZmFsc2VgIHJlc3VsdCBkb2VzIG5vdCBtZWFuIHRoZSBlbnRpdHkgaXMgbm90IGEgYnVzaW5lc3MsIGFzIHNvbWUgYnVzaW5lc3NlcyBkbyBub3QgdXNlIHRoZXNlIHN0cmluZ3MgaW4gdGhlIG5hbWVzIHVzZWQgZm9yIHRoZWlyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzX2J1c2luZXNzX25hbWVfZGV0ZWN0ZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldFBheVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTmV0UGF5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgbmV0IHBheSBmb3IgdGhlIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsPzogVG90YWw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gUGxhaWQgZGV0ZWN0cyBhIG5ldyBhY2NvdW50IGZvciBJdGVtcyBjcmVhdGVkIG9yIHVwZGF0ZWQgd2l0aCBbQWNjb3VudCBTZWxlY3QgdjJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLyNhY2NvdW50LXNlbGVjdCkuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IGNhbiBwcm9tcHQgeW91ciB1c2VycyB0byBzaGFyZSBuZXcgYWNjb3VudHMgd2l0aCB5b3UgdGhyb3VnaCBbQWNjb3VudCBTZWxlY3QgdjIgdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8jdXNpbmctdXBkYXRlLW1vZGUtdG8tcmVxdWVzdC1uZXctYWNjb3VudHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWVyIG51bWJlciBkYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFjY291bnQuIEFsbCB2YWx1ZXMgYXJlIG9wdGlvbmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGZvciB0aGUgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF93aXJlX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGluc3RpdHV0aW9uIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfYnJhbmNoYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2luc3RpdHV0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBicmFuY2ggbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9pbnN0aXR1dGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9icmFuY2g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQmFuayBpZGVudGlmaWVyIGNvZGUgKEJJQykuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9pYmFuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9iaWM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgbnVtYmVyIChJQkFOKS4gSWYgbm8gYWNjb3VudCBudW1iZXIgaXMgc3BlY2lmaWVkIHZpYSBgYWNjb3VudGAsIHdpbGwgYWxzbyBiZSB1c2VkIGFzIHRoZSBhY2NvdW50IG51bWJlciBieSBkZWZhdWx0LiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGludGVybmF0aW9uYWxfYmljYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9pYmFuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJBQ1Mgc29ydCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3Nfc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQgdmlhIEFDQVRTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNBVFNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0FUUyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVycyBmb3IgdGhlIGNsZWFyaW5naG91c2VzIHRoYXQgYXJlIGFzc29jY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaW4gb3JkZXIgb2YgcmVsZXZhbmNlLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgd2UgY2FuXFwndCBwcm92aWRlIGFueSBhY2NvdW50IGxldmVsIGRhdGEuIEluc3RpdHV0aW9uIGxldmVsIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbnN0aXR1dGlvbnMvZ2V0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgZHRjX251bWJlcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNIXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNIIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgT0F1dGggd2l0aCBDaGFzZSBCYW5rIChgaW5zXzU2YCksIENoYXNlIHdpbGwgaXNzdWUgXFxcInRva2VuaXplZFxcXCIgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXJzLCB3aGljaCBhcmUgbm90IHRoZSB1c2VyXFwncyBhY3R1YWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBUaGVzZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIChhbHNvIGtub3duIGFzIFRBTnMpIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIGBtYXNrYCBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcjsgZm9yIHRoaXMgcmVhc29uLCB3aGVuIGRpc3BsYXlpbmcgYWNjb3VudCBudW1iZXJzIHRvIHRoZSB1c2VyIHRvIGhlbHAgdGhlbSBpZGVudGlmeSB0aGVpciBhY2NvdW50IGluIHlvdXIgVUksIGFsd2F5cyB1c2UgdGhlIGBtYXNrYCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIHRoZSBgYWNjb3VudGAgbnVtYmVyLiBJZiBhIHVzZXIgcmV2b2tlcyB0aGVpciBwZXJtaXNzaW9ucyB0byB5b3VyIGFwcCwgdGhlIHRva2VuaXplZCBudW1iZXJzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gSWYgdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfNTZgLCB0aGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBhY2NvdW50YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudCwgaWYgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNITnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgT0F1dGggd2l0aCBDaGFzZSBCYW5rIChgaW5zXzU2YCksIENoYXNlIHdpbGwgaXNzdWUgXFxcInRva2VuaXplZFxcXCIgcm91dGluZyBhbmQgYWNjb3VudCBudW1iZXJzLCB3aGljaCBhcmUgbm90IHRoZSB1c2VyXFwncyBhY3R1YWwgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzLiBUaGVzZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIChhbHNvIGtub3duIGFzIFRBTnMpIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIGBtYXNrYCBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlcjsgZm9yIHRoaXMgcmVhc29uLCB3aGVuIGRpc3BsYXlpbmcgYWNjb3VudCBudW1iZXJzIHRvIHRoZSB1c2VyIHRvIGhlbHAgdGhlbSBpZGVudGlmeSB0aGVpciBhY2NvdW50IGluIHlvdXIgVUksIGFsd2F5cyB1c2UgdGhlIGBtYXNrYCByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIHRoZSBgYWNjb3VudGAgbnVtYmVyLiBJZiBhIHVzZXIgcmV2b2tlcyB0aGVpciBwZXJtaXNzaW9ucyB0byB5b3VyIGFwcCwgdGhlIHRva2VuaXplZCBudW1iZXJzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBJZiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc181NmAsIHRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGFjY291bnRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHJvdXRpbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQsIGlmIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfaW4/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgb3V0IG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9vdXQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50cyBhY2NvdW50IHZpYSBBVE9OLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQVRPTlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FUT04ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBVE9OXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBVE9OXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJBQ1MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDUyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQkFDUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIENhbmFkaWFuIGJhbmsgYWNjb3VudCB2aWEgRUZULlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGUge1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYW4gaW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgdmlhIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgbnVtYmVycyB1c2luZyB0aGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIGFuZCBCSUMvU1dJRlQgY29kZSBmb3JtYXQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSwgYWxzbyBrbm93biBhcyBTV0lGVCBjb2RlLCBmb3IgdGhpcyBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhbiBpbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCB2aWEgd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFZhbGlkIHZhbHVlcyBhcmUgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT21pdHRhYmxlVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBvcHRpb24gc2VjdXJpdHkuICBGb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIHRoaXMgZGF0YSBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgaWYgdGhlIGl0ZW0gaXMgdXNpbmcgYSBjdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3QsIGFuZCB0aGUgYHRpY2tlcmAgZmllbGQgb2YgdGhlIGN1c3RvbSBzZWN1cml0eSBmb2xsb3dzIHRoZSBbT0NDIE9wdGlvbiBTeW1ib2xdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wdGlvbl9zeW1ib2wjVGhlX09DQ19PcHRpb25fU3ltYm9sKSBzdGFuZGFyZCB3aXRoIG5vIHNwYWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3B0aW9uQ29udHJhY3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhpcyBvcHRpb24gY29udHJhY3QuIEl0IGlzIG9uZSBvZjogIGBwdXRgOiBmb3IgUHV0IG9wdGlvbiBjb250cmFjdHMgIGBjYWxsYDogZm9yIENhbGwgb3B0aW9uIGNvbnRyYWN0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9wdGlvbkNvbnRyYWN0XG4gICAgICovXG4gICAgY29udHJhY3RfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaWtlIHByaWNlIGZvciB0aGlzIG9wdGlvbiBjb250cmFjdCwgcGVyIHNoYXJlIG9mIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE9wdGlvbkNvbnRyYWN0XG4gICAgICovXG4gICAgc3RyaWtlX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRpY2tlciBvZiB0aGUgdW5kZXJseWluZyBzZWN1cml0eSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICB1bmRlcmx5aW5nX3NlY3VyaXR5X3RpY2tlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9yIGFuZCB0aGVpciBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE9yaWdpbmF0b3JcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBPcmlnaW5hdG9y4oCZcyBjbGllbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRvclxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRpbGlnZW5jZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdHJhbnNmZXIgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3kge1xuICAgIE9uY2VQZXJNb250aCA9ICdvbmNlX3Blcl9tb250aCcsXG4gICAgVHdpY2VQZXJNb250aCA9ICd0d2ljZV9wZXJfbW9udGgnLFxuICAgIE9uY2VQZXJXZWVrID0gJ29uY2VfcGVyX3dlZWsnLFxuICAgIERhaWx5ID0gJ2RhaWx5J1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIG90aGVyIGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtb3RoZXIpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3RoZXJBY2NvdW50U3VidHlwZSB7XG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYG90aGVyYC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE90aGVyRmlsdGVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxPdGhlckFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgT3RoZXJGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxPdGhlckFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQuICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYHBheXJvbGw6YCBQYXlyb2xsIGFjY291bnQgIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE92ZXJyaWRlQWNjb3VudFR5cGUge1xuICAgIEludmVzdG1lbnQgPSAnaW52ZXN0bWVudCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5JyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCcsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogRGF0YSB0byB1c2UgdG8gc2V0IHZhbHVlcyBvZiB0ZXN0IGFjY291bnRzLiBTb21lIHZhbHVlcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgYW5kIHdpbGwgaW5zdGVhZCB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBvdGhlciB0ZXN0IGRhdGEgaW4gb3JkZXIgdG8gYWNoaWV2ZSBtb3JlIGNvbnNpc3RlbnQsIHJlYWxpc3RpYyB0ZXN0IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3ZlcnJpZGVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHR5cGU6IE92ZXJyaWRlQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIHN0YXJ0IHdpdGggdGhpcyBhbW91bnQgYXMgdGhlIGN1cnJlbnQgYmFsYW5jZS4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBhbHdheXMgaGF2ZSB0aGlzIGFtb3VudCBhcyBpdHMgIGF2YWlsYWJsZSBiYWxhbmNlLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQgYmFsYW5jZSBvciBjaGFuZ2VzIGluIHRyYW5zYWN0aW9ucyBvdmVyIHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGZvcmNlX2F2YWlsYWJsZV9iYWxhbmNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSVNPLTQyMTcgY3VycmVuY3kgY29kZS4gSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgYmUgZGVub21pbmF0ZWQgaW4gdGhlIGdpdmVuIGN1cnJlbmN5LiBUcmFuc2FjdGlvbnMgd2lsbCBhbHNvIGJlIGluIHRoaXMgY3VycmVuY3kgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG1ldGE6IE1ldGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb25PdmVycmlkZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvbGRpbmdzT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBob2xkaW5ncz86IEhvbGRpbmdzT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpZGVudGl0eTogT3duZXJPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBsaWFiaWxpdHk6IExpYWJpbGl0eU92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmZsb3dNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGluZmxvd19tb2RlbDogSW5mbG93TW9kZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5jb21lPzogSW5jb21lT3ZlcnJpZGU7XG59XG4vKipcbiAqIERhdGEgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gT25seSB0aGUgYG5hbWVzYCBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJbiB0aGUgY2FzZSBvZiBhIGpvaW50IGFjY291bnQsIFBsYWlkIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHJlcG9ydCB0aGUgbmFtZXMgb2YgYWxsIGFjY291bnQgaG9sZGVycy4gIElmIGFuIEl0ZW0gY29udGFpbnMgbXVsdGlwbGUgYWNjb3VudHMgd2l0aCBkaWZmZXJlbnQgb3duZXIgbmFtZXMsIHNvbWUgaW5zdGl0dXRpb25zIHdpbGwgcmVwb3J0IGFsbCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaW4gZWFjaCBhY2NvdW50XFwncyBgbmFtZXNgIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQaG9uZU51bWJlcj59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8UGhvbmVOdW1iZXI+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEVtYWlsPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PEVtYWlsPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWRkcmVzcz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPjtcbiAgICAvKipcbiAgICAgKiBkb2N1bWVudF9pZCBpcyB0aGUgaWQgb2YgdGhlIGRvY3VtZW50IHRoYXQgdGhpcyBpZGVudGl0eSBiZWxvbmdzIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBBbnkgZmllbGRzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBkZWZhdWx0IFNhbmRib3ggaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZXNlIHNob3VsZCBhbHdheXMgYmUgdGhlIG5hbWVzIG9mIGluZGl2aWR1YWxzLCBldmVuIGZvciBidXNpbmVzcyBhY2NvdW50cy4gTm90ZSB0aGF0IHRoZSBzYW1lIG5hbWUgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIGFsbCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGhvbmVOdW1iZXI+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8UGhvbmVOdW1iZXI+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxFbWFpbD59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PEVtYWlsPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFkZHJlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPjtcbn1cbi8qKlxuICogSG93IGFuIGFzc2V0IGlzIG93bmVkLiAgYGFzc29jaWF0aW9uYDogT3duZXJzaGlwIGJ5IGEgY29ycG9yYXRpb24sIHBhcnRuZXJzaGlwLCBvciB1bmluY29ycG9yYXRlZCBhc3NvY2lhdGlvbiwgaW5jbHVkaW5nIGZvci1wcm9maXQgYW5kIG5vdC1mb3ItcHJvZml0IG9yZ2FuaXphdGlvbnMuIGBpbmRpdmlkdWFsYDogT3duZXJzaGlwIGJ5IGFuIGluZGl2aWR1YWwuIGBqb2ludGA6IEpvaW50IG93bmVyc2hpcCBieSBtdWx0aXBsZSBwYXJ0aWVzLiBgdHJ1c3RgOiBPd25lcnNoaXAgYnkgYSByZXZvY2FibGUgb3IgaXJyZXZvY2FibGUgdHJ1c3QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPd25lcnNoaXBUeXBlIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEluZGl2aWR1YWwgPSAnaW5kaXZpZHVhbCcsXG4gICAgSm9pbnQgPSAnam9pbnQnLFxuICAgIEFzc29jaWF0aW9uID0gJ2Fzc29jaWF0aW9uJyxcbiAgICBUcnVzdCA9ICd0cnVzdCdcbn1cblxuLyoqXG4gKiBGaWVsZCBkZXNjcmliaW5nIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBpcyBhIHBvc3Qgb2ZmaWNlIGJveC4gV2lsbCBiZSBgeWVzYCB3aGVuIGEgUC5PLiBib3ggaXMgZGV0ZWN0ZWQsIGBub2Agd2hlbiBQbGFpZCBjb25maXJtZWQgdGhlIGFkZHJlc3MgaXMgbm90IGEgUC5PLiBib3gsIGFuZCBgbm9fZGF0YWAgd2hlbiBQbGFpZCB3YXMgbm90IGFibGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhZGRyZXNzIGlzIGEgUC5PLiBib3guXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQT0JveFN0YXR1cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHVkZW50XFwncyBlbGlnaWJpbGl0eSBpbiB0aGUgUHVibGljIFNlcnZpY2UgTG9hbiBGb3JnaXZlbmVzcyBwcm9ncmFtLiBUaGlzIGlzIG9ubHkgcmV0dXJuZWQgaWYgdGhlIGluc3RpdHV0aW9uIGlzIEZlZExvYW4gKGBpbnNfMTE2NTI3YCkuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQU0xGU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVzdGltYXRlZCBkYXRlIGJvcnJvd2VyIHdpbGwgaGF2ZSBjb21wbGV0ZWQgMTIwIHF1YWxpZnlpbmcgbW9udGhseSBwYXltZW50cy4gUmV0dXJuZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgZXN0aW1hdGVkX2VsaWdpYmlsaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUFNMRlN0YXR1c1xuICAgICAqL1xuICAgIHBheW1lbnRzX21hZGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHJlbWFpbmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfcmVtYWluaW5nOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGRlZmluZSBzcGVjaWZpYyBwYXJ0aWVzIHRvIGEgZGVhbC4gVGhpcyBpbmNsdWRlcyB0aGUgZGlyZWN0IHBhcnRpY2lwYXRpbmcgcGFydGllcywgc3VjaCBhcyBib3Jyb3dlciBhbmQgc2VsbGVyIGFuZCB0aGUgaW5kaXJlY3QgcGFydGllcyBzdWNoIGFzIHRoZSBjcmVkaXQgcmVwb3J0IHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0aWVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxQYXJ0eT47XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlY2huaWNhbF9jb250YWN0PzogUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3R9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbWVyX3N1cHBvcnRfaW5mbz86IFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm87XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgd2hldGhlciB0aGUgcGFydG5lciBoYXMgZm9yd2FyZGVkIHRoZSBQbGFpZCBiYW5rIGFkZGVuZHVtIHRvIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19iYW5rX2FkZGVuZHVtX2NvbXBsZXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRzX3VuZGVyX21hbmFnZW1lbnQ/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFVSSXMgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24ocykgd2hlcmUgYSB1c2VyIGNhbiBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciB2aWEgYSB3ZWJ2aWV3LiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQsIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gVG8gbW9kaWZ5IHJlZGlyZWN0IFVSSXMgZm9yIGFuIGVuZCBjdXN0b21lciBhZnRlciBjcmVhdGluZyB0aGVtLCBnbyB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBbQVBJIHBhZ2VdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBieSByZWd1bGF0b3J5IGF1dGhvcml0aWVzLCBpZiBhcHBsaWNhYmxlLiBGb3IgYmFua3MsIHRoaXMgaXMgdGhlIEZESUMgQ2VydGlmaWNhdGUgTnVtYmVyLiBGb3IgY3JlZGl0IHVuaW9ucywgdGhpcyBpcyB0aGUgQ3JlZGl0IFVuaW9uIENoYXJ0ZXIgTnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpc3RyYXRpb25fbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uX3NlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IFBhcnRuZXJFbmRDdXN0b21lcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmxvd2Rvd25fc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBxdWVzdGlvbm5haXJlX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIGluc3RpdHV0aW9ucyB3aXRoIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJlZ2lzdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9pZGAgb2YgdGhlIGVuZCBjdXN0b21lciB0byBiZSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciBhbiBlbmQgY3VzdG9tZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbn1cbi8qKlxuICogVGhlIGVuZCBjdXN0b21lclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldHMgdW5kZXIgbWFuYWdlbWVudCBmb3IgdGhlIGdpdmVuIGVuZCBjdXN0b21lci4gUmVxdWlyZWQgZm9yIGVuZCBjdXN0b21lcnMgd2l0aCBtb250aGx5IHNlcnZpY2UgY29tbWl0bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQXNzZXRzVW5kZXJNYW5hZ2VtZW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGJpbGxpbmcgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgYmlsbGluZyBjb250YWN0IGlmIG9taXR0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgaW5mb3JtYXRpb24gaXMgcHVibGljLiBVc2VycyBvZiB5b3VyIGFwcCB3aWxsIHNlZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gbWFuYWdpbmcgY29ubmVjdGlvbnMgYmV0d2VlbiB5b3VyIGFwcCBhbmQgdGhlaXIgYmFuayBhY2NvdW50cyBpbiBQbGFpZCBQb3J0YWwuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGN1c3RvbWVyIHN1cHBvcnQgaW5mbyBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICAgICAqL1xuICAgIGNvbnRhY3RfdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBsaW5rX3VwZGF0ZV91cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGFkZGVuZHVtIHRvIHRoZSBQbGFpZCBNU0EgKFxcXCJmbG93ZG93blxcXCIpIGZvciB0aGUgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIEluUmV2aWV3ID0gJ0lOX1JFVklFVycsXG4gICAgTmVnb3RpYXRpb24gPSAnTkVHT1RJQVRJT04nLFxuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRoZSBPQXV0aCByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgZW52aXJvbm1lbnRzPzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50cztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbiB3YXMgYXBwcm92ZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlaXIgYXBwbGljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBhcHByb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9lbmFibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIG5vbi1PQXV0aCBJdGVtIGFkZHMgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGZvciB0aGlzIGluc3RpdHV0aW9uLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gc3VjaCBkYXRlIGhhcyBiZWVuIHNldCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGNsYXNzaWNfZGlzYWJsZW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZWdpc3RyYXRpb24gc3RhdHVzIGZvciB0aGUgZW5kIGN1c3RvbWVyXFwncyBhcHBsaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cyB7XG4gICAgTm90U3RhcnRlZCA9ICdOT1RfU1RBUlRFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQUk9DRVNTSU5HJyxcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRW5hYmxlZCA9ICdFTkFCTEVEJyxcbiAgICBBdHRlbnRpb25SZXF1aXJlZCA9ICdBVFRFTlRJT05fUkVRVUlSRUQnXG59XG5cbi8qKlxuICogUmVnaXN0cmF0aW9uIHN0YXR1c2VzIGJ5IGVudmlyb25tZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICAgICAqL1xuICAgIGRldmVsb3BtZW50PzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBwcm9kdWN0aW9uPzogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgT0F1dGggc3RhdHVzIG9mIHRoZSB1cGRhdGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlcyB7XG4gICAgTm90U3RhcnRlZCA9ICdub3Qtc3RhcnRlZCcsXG4gICAgUHJvY2Vzc2luZyA9ICdwcm9jZXNzaW5nJyxcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRW5hYmxlZCA9ICdlbmFibGVkJyxcbiAgICBBdHRlbnRpb25SZXF1aXJlZCA9ICdhdHRlbnRpb24tcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgUEFSVE5FUmAgYW5kIGNvZGUgYEVORF9DVVNUT01FUl9PQVVUSF9TVEFUVVNfVVBEQVRFRGAgd2lsbCBiZSBmaXJlZCB3aGVuIGEgcGFydG5lclxcJ3MgZW5kIGN1c3RvbWVyIGhhcyBhbiB1cGRhdGUgb24gdGhlaXIgT0F1dGggcmVnaXN0cmF0aW9uIHN0YXR1cyB3aXRoIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVORF9DVVNUT01FUl9PQVVUSF9TVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gSURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3VyaXR5IHF1ZXN0aW9ubmFpcmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJRdWVzdGlvbm5haXJlU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBSZWNlaXZlZCA9ICdSRUNFSVZFRCcsXG4gICAgQ29tcGxldGUgPSAnQ09NUExFVEUnXG59XG5cbi8qKlxuICogVGhlIHNlY3JldHMgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGVuZCBjdXN0b21lciBpbiBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgc2FuZGJveD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIGRldmVsb3BtZW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBlbmQgY3VzdG9tZXIuICBgVU5ERVJfUkVWSUVXYDogVGhlIGVuZCBjdXN0b21lciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBlbmFibGVkIGluIHRoZSBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuIFRoZSBlbmQgY3VzdG9tZXIgbXVzdCBiZSBtYW51YWxseSByZXZpZXdlZCBieSB0aGUgUGxhaWQgdGVhbSBiZWZvcmUgaXQgY2FuIGJlIGVuYWJsZWQgaW4gcHJvZHVjdGlvbiwgYXQgd2hpY2ggcG9pbnQgaXRzIHN0YXR1cyB3aWxsIGF1dG9tYXRpY2FsbHkgdHJhbnNpdGlvbiB0byBgUEVORElOR19FTkFCTEVNRU5UYCBvciBgREVOSUVEYC4gIGBQRU5ESU5HX0VOQUJMRU1FTlRgOiBUaGUgZW5kIGN1c3RvbWVyIGlzIHJlYWR5IHRvIGJlIGVuYWJsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIENhbGwgdGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IHRvIGVuYWJsZSB0aGUgZW5kIGN1c3RvbWVyIGluIFByb2R1Y3Rpb24uICBgQUNUSVZFYDogVGhlIGVuZCBjdXN0b21lciBoYXMgYmVlbiBlbmFibGVkIGluIGFsbCBlbnZpcm9ubWVudHMuICBgREVOSUVEYDogVGhlIGVuZCBjdXN0b21lciBoYXMgYmVlbiBjcmVhdGVkIGFuZCBlbmFibGVkIGluIHRoZSBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMsIGJ1dCBpdCBkaWQgbm90IHBhc3MgcmV2aWV3IGJ5IHRoZSBQbGFpZCB0ZWFtIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGVuYWJsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIFRhbGsgdG8geW91ciBBY2NvdW50IE1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXMge1xuICAgIFVuZGVyUmV2aWV3ID0gJ1VOREVSX1JFVklFVycsXG4gICAgUGVuZGluZ0VuYWJsZW1lbnQgPSAnUEVORElOR19FTkFCTEVNRU5UJyxcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBEZW5pZWQgPSAnREVOSUVEJ1xufVxuXG4vKipcbiAqIFRoZSB0ZWNobmljYWwgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgdGVjaG5pY2FsIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBub24tUHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c1xuICAgICAqL1xuICAgIHN0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwYXJ0eSB0byBhIHRyYW5zYWN0aW9uLiBJbmNsdWRlZCBkaXJlY3QgcGFydGljaXBhbnRzIGxpa2UgdGhlIGJvcnJvd2VyIGFuZCBzZWxsZXIgYXMgd2VsbCBhcyBpbmRpcmVjdCBwYXJ0aWNpcGFudHMgc3VjaCBhcyB0aGUgZmxvb2QgY2VydGlmaWNhdGUgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0eUluZGl2aWR1YWx9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5XG4gICAgICovXG4gICAgSU5ESVZJRFVBTDogUGFydHlJbmRpdmlkdWFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBST0xFUzogUm9sZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5XG4gICAgICovXG4gICAgVEFYUEFZRVJfSURFTlRJRklFUlM6IFRheHBheWVySWRlbnRpZmllcnM7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlJbmRpdmlkdWFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbE5hbWV9XG4gICAgICogQG1lbWJlcm9mIFBhcnR5SW5kaXZpZHVhbFxuICAgICAqL1xuICAgIE5BTUU6IEluZGl2aWR1YWxOYW1lO1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBkZWZpbmVkIGxpc3QgdGhhdCBpZGVudGlmaWVzIHRoZSByb2xlIHRoYXQgdGhlIHBhcnR5IHBsYXlzIGluIHRoZSB0cmFuc2FjdGlvbi4gUGFydGllcyBtYXkgYmUgZWl0aGVyIGEgcGVyc29uIG9yIGxlZ2FsIGVudGl0eS4gQSBwYXJ0eSBtYXkgcGxheSBtdWx0aXBsZSByb2xlcyBpbiBhIHRyYW5zYWN0aW9uLkEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0eVJvbGVUeXBlIHtcbiAgICBCb3Jyb3dlciA9ICdCb3Jyb3dlcidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbW9uZXRhcnkgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbnVtZXJpY2FsIGFtb3VudCBvZiBhIHNwZWNpZmljIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVuY3kgY29kZSwgZS5nLiBVU0RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheUZyZXF1ZW5jeVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeVZhbHVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2YWx1ZTogUGF5RnJlcXVlbmN5VmFsdWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5RnJlcXVlbmN5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5RnJlcXVlbmN5VmFsdWUge1xuICAgIE1vbnRobHkgPSAnbW9udGhseScsXG4gICAgU2VtaW1vbnRobHkgPSAnc2VtaW1vbnRobHknLFxuICAgIFdlZWtseSA9ICd3ZWVrbHknLFxuICAgIEJpd2Vla2x5ID0gJ2Jpd2Vla2x5JyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kge1xuICAgIFBheUZyZXF1ZW5jeVVua25vd24gPSAnUEFZX0ZSRVFVRU5DWV9VTktOT1dOJyxcbiAgICBQYXlGcmVxdWVuY3lXZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9XRUVLTFknLFxuICAgIFBheUZyZXF1ZW5jeUJpd2Vla2x5ID0gJ1BBWV9GUkVRVUVOQ1lfQklXRUVLTFknLFxuICAgIFBheUZyZXF1ZW5jeVNlbWltb250aGx5ID0gJ1BBWV9GUkVRVUVOQ1lfU0VNSU1PTlRITFknLFxuICAgIFBheUZyZXF1ZW5jeU1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9NT05USExZJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSB0b3RhbCBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnRzIHRoYXQgdGhlIHBheW1lbnQgd2FzIGRpc3RyaWJ1dGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBob3VycyBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIb3VybHkgcmF0ZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIHRoZSBlYXJuaW5ncyBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGhvdXJzIHdvcmtlZCBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWN1cml0eS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBlbmRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC9kZWR1Y3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9iYXNpcz86IENyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheSBwZXJpb2Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRheHBheWVyIElEIG9mIHRoZSBpbmRpdmlkdWFsIHJlY2VpdmluZyB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YlRheHBheWVySURcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG1hc2s7IGkuZS4gbGFzdCA0IGRpZ2l0cyBvZiB0aGUgdGF4cGF5ZXIgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcGF5bWVudC4gRm9yIHN0YW5kaW5nIG9yZGVycyBhbmQgcGF5bWVudCBjb25zZW50cywgYFxcXCJHQlBcXFwiYCBtdXN0IGJlIHVzZWQuIEZvciBQb2xhbmQsIERlbm1hcmssIFN3ZWRlbiBhbmQgTm9yd2F5LCBvbmx5IHRoZSBsb2NhbCBjdXJyZW5jeSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5IHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJyxcbiAgICBQbG4gPSAnUExOJyxcbiAgICBTZWsgPSAnU0VLJyxcbiAgICBEa2sgPSAnREtLJyxcbiAgICBOb2sgPSAnTk9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnROdWxsYWJsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFJlZnVuZGVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnRUb1JlZnVuZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENoYW5uZWwge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIE1heGltdW0gYW1vdW50IG9mIGEgc2luZ2xlIHBheW1lbnQgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50TWF4UGF5bWVudEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBXaGVyZSB0aGUgcGF5bWVudCBjb25zZW50IHBlcmlvZCBzaG91bGQgc3RhcnQuICBgQ0FMRU5EQVJgOiBsaW5lIHVwIHdpdGggYSBjYWxlbmRhci4gIGBDT05TRU5UYDogb24gdGhlIGRhdGUgb2YgY29uc2VudCBjcmVhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbGlnbm1lbnQge1xuICAgIENhbGVuZGFyID0gJ0NBTEVOREFSJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogRGVmaW5lcyBjb25zZW50IHBheW1lbnRzIGxpbWl0YXRpb25zIHBlciBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgcGVyaW9kaWMgaW50ZXJ2YWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWwge1xuICAgIERheSA9ICdEQVknLFxuICAgIFdlZWsgPSAnV0VFSycsXG4gICAgTW9udGggPSAnTU9OVEgnLFxuICAgIFllYXIgPSAnWUVBUidcbn1cblxuLyoqXG4gKiBMaWZlIHNwYW4gZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIEFmdGVyIHRoZSBgdG9gIGRhdGUgdGhlIHBheW1lbnQgY29uc2VudCBleHBpcmVzIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGZyb20gd2hpY2ggdGhlIGNvbnNlbnQgc2hvdWxkIGJlIGFjdGl2ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIGZyb20/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBjb25zZW50IGV4cGlyZXMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWVcbiAgICAgKi9cbiAgICB0bz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBvcHRpb25hbCBhZGRyZXNzIG9mIHRoZSBwYXltZW50IHJlY2lwaWVudFxcJ3MgYmFuayBhY2NvdW50LiBSZXF1aXJlZCBieSBtb3N0IGluc3RpdHV0aW9ucyBvdXRzaWRlIG9mIHRoZSBVSy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBsZW5ndGggMS0yIHJlcHJlc2VudGluZyB0aGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDcwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgMzUgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAxNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQ29uc2VudCBjcmVhdGlvbiB0aW1lc3RhbXAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCBjb25zZW50IHNjb3Blcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbn1cbi8qKlxuICogTGltaXRhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gcGF5bWVudHMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRDb25zZW50VmFsaWREYXRlVGltZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICB2YWxpZF9kYXRlX3RpbWU/OiBQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgbWF4X3BheW1lbnRfYW1vdW50OiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFtb3VudCBsaW1pdGF0aW9ucyBwZXIgcGVyaW9kIG9mIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIHBlcmlvZGljX2Ftb3VudHM6IEFycmF5PFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQ+O1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLiBUaGUgY3JlYXRlZCBjb25zZW50IGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIGZ1bmRzIHRvIHRoaXMgcmVjaXBpZW50IG9ubHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBUaGlzIG11c3QgYmUgYW4gYWxwaGFudW1lcmljIHN0cmluZyB3aXRoIGF0IG1vc3QgMTggY2hhcmFjdGVycyBhbmQgbXVzdCBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IGNvbnNlbnQgc2NvcGVzLlxuICAgICAqIEB0eXBlIHtTZXQ8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NvcGVzOiBTZXQ8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb25zZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGNvbnNlbnQgcGF5bWVudC4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gSWYgYSByZXF1ZXN0IHRvIGV4ZWN1dGUgYSBjb25zZW50IHBheW1lbnQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcGF5bWVudCBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSBwYXltZW50IHRoYXQgdXNlcyB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXksIGFuZCB3YXMgcmVjZWl2ZWQgd2l0aGluIDI0IGhvdXJzIG9mIHRoZSBmaXJzdCByZXF1ZXN0LCBmcm9tIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnQgY29uc2VudCBzY29wZS4gRGVmaW5lcyBwb3NzaWJsZSBkaXJlY3Rpb25zIGZvciBwYXltZW50cyBtYWRlIHdpdGggdGhlIGdpdmVuIGNvbnNlbnQuICBgTUVfVE9fTUVgOiBBbGxvd3MgbW92aW5nIG1vbmV5IGJldHdlZW4gYWNjb3VudHMgb3duZWQgYnkgdGhlIHNhbWUgdXNlci4gIGBFWFRFUk5BTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlIHtcbiAgICBNZVRvTWUgPSAnTUVfVE9fTUUnLFxuICAgIEV4dGVybmFsID0gJ0VYVEVSTkFMJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHBheW1lbnQgY29uc2VudC4gIGBVTkFVVEhPUklTRURgOiBDb25zZW50IGNyZWF0ZWQsIGJ1dCByZXF1aXJlcyB1c2VyIGF1dGhvcmlzYXRpb24uICBgUkVKRUNURURgOiBDb25zZW50IGF1dGhvcmlzYXRpb24gd2FzIHJlamVjdGVkIGJ5IHRoZSB1c2VyIGFuZC9vciB0aGUgYmFuay4gIGBBVVRIT1JJU0VEYDogQ29uc2VudCBpcyBhY3RpdmUgYW5kIHJlYWR5IHRvIGJlIHVzZWQuICBgUkVWT0tFRGA6IENvbnNlbnQgaGFzIGJlZW4gcmV2b2tlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiAgYEVYUElSRURgOiBDb25zZW50IGlzIG5vIGxvbmdlciB2YWxpZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cyB7XG4gICAgVW5hdXRob3Jpc2VkID0gJ1VOQVVUSE9SSVNFRCcsXG4gICAgQXV0aG9yaXNlZCA9ICdBVVRIT1JJU0VEJyxcbiAgICBSZXZva2VkID0gJ1JFVk9LRUQnLFxuICAgIFJlamVjdGVkID0gJ1JFSkVDVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIFNFUEEgSW5zdGFudCBwYXltZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3NlcGFfaW5zdGFudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHVzZWQgdG8gcmVzdHJpY3QgdGhlIGFjY291bnRzIHVzZWQgZm9yIHBheW1lbnRzLiBJZiBwcm92aWRlZCwgdGhlIGVuZCB1c2VyIHdpbGwgYmUgYWJsZSB0byBzZW5kIHBheW1lbnRzIG9ubHkgZnJvbSB0aGUgc3BlY2lmaWVkIGJhbmsgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmVmdW5kIElEcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZvciBhIHBheW1lbnQgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCwgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgdmFsdWU6ICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhlIGluaXRpYWwgcGhhc2Ugb2YgdGhlIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cyB7XG4gICAgUGF5bWVudFN0YXR1c0lucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgcGF5bWVudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkanVzdGVkX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9kZXRhaWxzPzogRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbmRlckJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRSZWZ1bmRlZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnRfcmVmdW5kZWQ/OiBQYXltZW50QW1vdW50UmVmdW5kZWQ7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc2NoZW1lPzogUGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgY29uc2VudCBJRCB0aGF0IHRoaXMgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHdpdGguIElzIHByZXNlbnQgb25seSB3aGVuIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXltZW50cyB0byByZXR1cm4uIElmIGBjb3VudGAgaXMgbm90IHNwZWNpZmllZCwgYSBtYXhpbXVtIG9mIDEwIHBheW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQsIGJlZ2lubmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBwYXltZW50IGJlZm9yZSB0aGUgY3Vyc29yIChpZiBzcGVjaWZpZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBcXFwiMjAxOS0xMi0wNlQyMjozNTo0OVpcXFwiKS4gT25seSBwYXltZW50cyBjcmVhdGVkIGJlZm9yZSB0aGUgY3Vyc29yIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELiBJZiBzcGVjaWZpZWQsIG9ubHkgcGF5bWVudHMsIGV4ZWN1dGVkIHVzaW5nIHRoaXMgY29uc2VudCwgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudHM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD47XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIHRoYXQsIHdoZW4gdXNlZCBhcyB0aGUgb3B0aW9uYWwgYGN1cnNvcmAgcGFyYW1ldGVyIHRvIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAsIHdpbGwgcmV0dXJuIHRoZSBuZXh0IHVucmV0dXJuZWQgcGF5bWVudCBhcyBpdHMgZmlyc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudCB0byByZXZlcnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSByZWZ1bmQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRUb1JlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBQYXltZW50QW1vdW50VG9SZWZ1bmQ7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZWZ1bmRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudC4gIGBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgOiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIG9mIGFsbCBwYXltZW50cy4gSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHBheW1lbnQgaXMgd2FpdGluZyBvbiB1c2VyIGlucHV0IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuIEEgcGF5bWVudCBtYXkgcmUtZW50ZXIgdGhpcyBzdGF0ZSBsYXRlciBvbiBpZiBmdXJ0aGVyIGlucHV0IGlzIG5lZWRlZC4gIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYXV0aG9yaXNlZCBhbmQgYWNjZXB0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRm9yIHN1Y2Nlc3NmdWwgcGF5bWVudHMsIHRoaXMgaXMgYSBwb3RlbnRpYWwgdGVybWluYWwgc3RhdHVzLiBGdXJ0aGVyIHN0YXR1cyB0cmFuc2l0aW9ucyBjYW4gYmUgdG8gUkVKRUNURUQgYW5kLCB3aGVuIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24sIHRvIEVYRUNVVEVELiAgYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2A6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBQQVlNRU5UX1NUQVRVU19GQUlMRURgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIHRvIGJlIGluaXRpYXRlZC4gVGhpcyBlcnJvciBtYXkgYmUgY2F1c2VkIGJ5IHRyYW5zaWVudCBzeXN0ZW0gb3V0YWdlcyBhbmQgaXMgcmV0cnlhYmxlIG9uY2UgdGhlIHJvb3QgY2F1c2UgaXMgcmVzb2x2ZWQuICBgUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIGJsb2NrZWQgYnkgUGxhaWQuIFRoaXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgZHVlIHRvIFBsYWlkIGZsYWdnaW5nIHRoZSBwYXltZW50IGFzIHBvdGVudGlhbGx5IHJpc2t5LiBUaGlzIGlzIGEgcmV0cnlhYmxlIGVycm9yLiAgYFBBWU1FTlRfU1RBVFVTX0FVVEhPUklTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaGFzIGF1dGhvcmlzZWQgdGhlIHRyYW5zYWN0aW9uLiAgYFBBWU1FTlRfU1RBVFVTX0NBTkNFTExFRGA6IFRoZSBwYXltZW50IHdhcyBjYW5jZWxsZWQgKHR5cGljYWxseSBieSB0aGUgZW5kIHVzZXIpIGR1cmluZyBhdXRob3Jpc2F0aW9uLiAgYFBBWU1FTlRfU1RBVFVTX0VYRUNVVEVEYDogVGhlIGZ1bmRzIGhhdmUgc3VjY2Vzc2Z1bGx5IGxlZnQgdGhlIHBheWVyIGFjY291bnQgYW5kIHBheW1lbnQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gTm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGlzIHN0YXR1czogc3VwcG9ydCBpcyBtb3JlIGNvbW1vbiBpbiB0aGUgVUssIGFuZCBsZXNzIGNvbW1vbiBpbiB0aGUgRVUuIEZvciBpbnN0aXR1dGlvbnMgd2hlcmUgdGhpcyBzdGF0dXMgaXMgbm90IHN1cHBvcnRlZCwgdGhlIHRlcm1pbmFsIHN0YXR1cyBmb3IgYSBzdWNjZXNzZnVsIHBheW1lbnQgd2lsbCBiZSBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYC4gIGBQQVlNRU5UX1NUQVRVU19TRVRUTEVEYDogVGhlIHBheW1lbnQgaGFzIHNldHRsZWQgYW5kIGZ1bmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZS4gQSBwYXltZW50IHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gVGhpcyBzdGF0dXMgaXMgb25seSBhdmFpbGFibGUgdG8gY3VzdG9tZXJzIHVzaW5nIFtQbGFpZCBWaXJ0dWFsIEFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3ZpcnR1YWwtYWNjb3VudHMvKS4gIGBQQVlNRU5UX1NUQVRVU19FU1RBQkxJU0hFRGA6IEluZGljYXRlcyB0aGF0IHRoZSBzdGFuZGluZyBvcmRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGZvciBzdGFuZGluZyBvcmRlcnMuICBgUEFZTUVOVF9TVEFUVVNfUkVKRUNURURgOiBUaGUgcGF5bWVudCB3YXMgcmVqZWN0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIERlcHJlY2F0ZWQ6IFRoZXNlIHN0YXR1c2VzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiAgYFBBWU1FTlRfU1RBVFVTX1VOS05PV05gOiBUaGUgcGF5bWVudCBzdGF0dXMgaXMgdW5rbm93bi4gIGBQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cyB7XG4gICAgSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTklUSUFURUQnLFxuICAgIENvbXBsZXRlZCA9ICdQQVlNRU5UX1NUQVRVU19DT01QTEVURUQnLFxuICAgIEluc3VmZmljaWVudEZ1bmRzID0gJ1BBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EUycsXG4gICAgRmFpbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0ZBSUxFRCcsXG4gICAgQmxvY2tlZCA9ICdQQVlNRU5UX1NUQVRVU19CTE9DS0VEJyxcbiAgICBVbmtub3duID0gJ1BBWU1FTlRfU1RBVFVTX1VOS05PV04nLFxuICAgIEV4ZWN1dGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1BBWU1FTlRfU1RBVFVTX1NFVFRMRUQnLFxuICAgIEF1dGhvcmlzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX0FVVEhPUklTSU5HJyxcbiAgICBDYW5jZWxsZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEJyxcbiAgICBFc3RhYmxpc2hlZCA9ICdQQVlNRU5UX1NUQVRVU19FU1RBQkxJU0hFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfUkVKRUNURUQnXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYHBheW1lbnRfdG9rZW5gIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgdGhlIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgdG9rZW4gd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgcGF5bWVudF90b2tlbmAgZXhwaXJlcyBhZnRlciAxNSBtaW51dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHJlY2lwaWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC4gV2UgcmVjb21tZW5kIHVzaW5nIHN0cmluZ3Mgb2YgbGVuZ3RoIDE4IG9yIGxlc3MgYW5kIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVycyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LiBJZiBCQUNTIGRhdGEgaXMgbm90IHByb3ZpZGVkLCBhbiBJQkFOIGlzIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCByZWNpcGllbnRzIGNyZWF0ZWQgZm9yIFBheW1lbnQgSW5pdGlhdGlvblxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdmFsaWQgUGF5bWVudCBJbml0aWF0aW9uIHN0YW5kaW5nIG9yZGVyIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBjbG9zZWQtZW5kZWQgc3RhbmRpbmcgb3JkZXJzIGJ5IHByb3ZpZGluZyBhbiBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19zdGFuZGluZ19vcmRlcl9lbmRfZGF0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBgTU9OVEhMWWAgc3RhbmRpbmcgb3JkZXJzLiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgbmVnYXRpdmUgaW50ZWdlcnMgKC0xIHRvIC01KSBmb3Igc2V0dGluZyB1cCBhIGBNT05USExZYCBzdGFuZGluZyBvcmRlciByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19zdGFuZGluZ19vcmRlcl9uZWdhdGl2ZV9leGVjdXRpb25fZGF5czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIHZhbGlkIHN0YW5kaW5nIG9yZGVyIGludGVydmFscyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50U2NoZWR1bGVJbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgdmFsaWRfc3RhbmRpbmdfb3JkZXJfaW50ZXJ2YWxzOiBBcnJheTxQYXltZW50U2NoZWR1bGVJbnRlcnZhbD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGludGVyLWJhbmsgdHJhbnNmZXJzLiBJZiB0aGUgdHJhbnNhY3Rpb24gd2FzIG5vdCBhbiBpbnRlci1iYW5rIHRyYW5zZmVyLCBhbGwgZmllbGRzIHdpbGwgYmUgYG51bGxgLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGUgYHBheW1lbnRfbWV0YWAga2V5IHdpbGwgYWx3YXlzIGFwcGVhciwgYnV0IG5vIGRhdGEgZWxlbWVudHMgYXJlIGd1YXJhbnRlZWQuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRNZXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50TWV0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiByZWZlcmVuY2UgbnVtYmVyIHN1cHBsaWVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICByZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggUFBEIElEIGZvciB0aGUgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwcGRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcmVjZWl2aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0eSBpbml0aWF0aW5nIGEgd2lyZSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBhIHdpcmUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBieV9vcmRlcl9vZjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNmZXJzLCB0aGUgcGFydHkgdGhhdCBpcyBwYXlpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5ZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdHJhbnNmZXIsIGUuZy4gXFwnQUNIXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5bWVudCBwcm9jZXNzb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvY2Vzc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXllci1zdXBwbGllZCBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICByZWFzb246IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyB1cGRhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGNyZWF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgZGVsZXRlZCBhdC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgUGF5bWVudCBQcm9maWxlIGhhcyBub3QgYmVlbiBkZWxldGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRQcm9maWxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50UHJvZmlsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiAgYFJFQURZYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaXMgcmVhZHkgdG8gYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuICBgUEVORElOR2A6IFRoaXMgUGF5bWVudCBQcm9maWxlIGlzIG5vdCByZWFkeSB0byBiZSB1c2VkLiBZb3XigJlsbCBuZWVkIHRvIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZCB0byBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UuICBgUkVNT1ZFRGA6IFRoaXMgUGF5bWVudCBQcm9maWxlIGhhcyBiZWVuIHJlbW92ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50UHJvZmlsZVN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBSZWFkeSA9ICdSRUFEWScsXG4gICAgUmVtb3ZlZCA9ICdSRU1PVkVEJ1xufVxuXG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgaW50ZXJ2YWwgb2YgdGhlIHBheW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50U2NoZWR1bGVJbnRlcnZhbCB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJ1xufVxuXG4vKipcbiAqIFBheW1lbnQgc2NoZW1lLiBJZiBub3Qgc3BlY2lmaWVkIC0gdGhlIGRlZmF1bHQgaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHVzZWQgKGUuZy4gYFNFUEFfQ1JFRElUX1RSQU5TRkVSYCBmb3IgRVUpLiBVc2luZyB1bnN1cHBvcnRlZCB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gYSBmYWlsZWQgcGF5bWVudC4gIGBMT0NBTF9ERUZBVUxUYDogVGhlIGRlZmF1bHQgcGF5bWVudCBzY2hlbWUgZm9yIHRoZSBzZWxlY3RlZCBtYXJrZXQgYW5kIGN1cnJlbmN5IHdpbGwgYmUgdXNlZC4gIGBMT0NBTF9JTlNUQU5UYDogVGhlIGluc3RhbnQgcGF5bWVudCBzY2hlbWUgZm9yIHRoZSBzZWxlY3RlZCBtYXJrZXQgYW5kIGN1cnJlbmN5IHdpbGwgYmUgdXNlZCAoaWYgYXBwbGljYWJsZSkuIEZlZXMgbWF5IGJlIGFwcGxpZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJZiB0aGUgbWFya2V0IGRvZXMgbm90IHN1cHBvcnQgYW4gSW5zdGFudCBTY2hlbWUgKGUuZy4gRGVubWFyayksIHRoZSBkZWZhdWx0IGluIHRoZSByZWdpb24gd2lsbCBiZSB1c2VkLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHdpdGhpbiB0aGUgU0VQQSBhcmVhLiBNYXkgaW52b2x2ZSBhZGRpdGlvbmFsIGZlZXMgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIGF0IHNvbWUgYmFua3MuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIExvY2FsRGVmYXVsdCA9ICdMT0NBTF9ERUZBVUxUJyxcbiAgICBMb2NhbEluc3RhbnQgPSAnTE9DQUxfSU5TVEFOVCcsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBoYXMgY2hhbmdlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfSU5JVElBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVlNRU5UX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIGZvciB0aGUgcGF5bWVudCBiZWluZyB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHdoZW4gY3JlYXRpbmcgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9yZWZlcmVuY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGBzdGFydF9kYXRlYCBwcm92aWRlZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgc3RhbmRpbmcgb3JkZXIuIElmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYWxfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCBvciBpZiB0aGUgcGF5bWVudCBpcyBub3QgYSBzdGFuZGluZyBvcmRlciwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGFjY291bnQgbGV2ZWwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXJvbGxJbmNvbWVSYXRlT2ZQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIHJhdGVfb2ZfcGF5OiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5O1xuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgcGF5cm9sbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXkgc3R1YnMgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRQYXlTdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIHBheV9zdHViczogQXJyYXk8Q3JlZGl0UGF5U3R1Yj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdGF4IGZvcm0gVy0ycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0VzI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgdzJzOiBBcnJheTxDcmVkaXRXMj47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdGF4IGZvcm0gMTA5OXMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdDEwOTk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgZm9ybTEwOTlzOiBBcnJheTxDcmVkaXQxMDk5Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmF0ZSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmF0ZSBhdCB3aGljaCBhbiBlbXBsb3llZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAgICAgKi9cbiAgICBwYXlfcmF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBhdCB3aGljaCBhbiBlbXBsb3llZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXlcbiAgICAgKi9cbiAgICBwYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lOiBBcnJheTxQYXlyb2xsSW5jb21lT2JqZWN0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEl0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXlyb2xsSXRlbVN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBJdGVtIHdhcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtU3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSXRlbVN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERlbm90ZXMgdGhlIHByb2Nlc3Npbmcgc3RhdHVzIGZvciB0aGUgdmVyaWZpY2F0aW9uLiAgYFVOS05PV05gOiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgYW5kIHRoZSB1c2VyIGhhcyBhcHByb3ZlZCBmb3Igc2hhcmluZy4gVGhlIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGJlIHJldHJpZXZlZC4gIGBQUk9DRVNTSU5HYDogVGhlIHZlcmlmaWNhdGlvbiBpcyBzdGlsbCBwcm9jZXNzaW5nLiBUaGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIHlldC4gIGBGQUlMRURgOiBUaGUgcHJvY2Vzc2luZyBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiAgYEFQUFJPVkFMX1NUQVRVU19QRU5ESU5HYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBidXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgYXBwcm92ZWQgdGhlIHNoYXJpbmcgb2YgdGhlIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBwcm9jZXNzaW5nX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBJdGVtIGxpbmtlZCBhcyBwYXJ0IG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGluY29tZSBkb2N1bWVudCBhdXRoZW50aWNpdHkgZGF0YSByZXRyaWV2ZWQgZm9yIGVhY2ggb2YgdGhlIHVzZXJcXCdzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIGVuZCB1c2VyXFwncyBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkb2NfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50RGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1wbG95bWVudF9kZXRhaWxzPzogRW1wbG95bWVudERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IE5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlsczogUGF5UGVyaW9kRGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkRldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheXN0dWJfZGV0YWlscz86IFBheXN0dWJEZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YllURERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHl0ZF9lYXJuaW5ncz86IFBheXN0dWJZVEREZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUxPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0ZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVkdWN0aW9uIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiwgYXMgcHJvdmlkZWQgb24gdGhlIHBheXN0dWIuIEZvciBleGFtcGxlOiBgXFxcIjQwMShrKVxcXCJgLCBgXFxcIkZJQ0EgTUVEIFRBWFxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZGVkdWN0aW9uIGlzIHByZS10YXg7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgaXNfcHJldGF4OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRldGFpbHMgdGhhdCBjYW4gYmUgZm91bmQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEJlZ2lubmluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2Rfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9lbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGF5IGRhdGUgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgZ2VuZXJhdGVkIHRoZSBwYXlzdHViLCBlLmcuIEFEUFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5c3R1Yl9wcm92aWRlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheXN0dWJQYXlGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkVtcGxveWVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkYXRhIGZyb20gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJPdmVycmlkZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgaW5jb21lX2JyZWFrZG93bj86IEFycmF5PEluY29tZUJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlscz86IFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50cyB0aGF0IHRoZSBwYXltZW50IHdhcyBkaXN0cmlidXRlZCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYmFua19uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZW1wbG95ZWUgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3M7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBlbXBsb3llZSBpcyBwYWlkLiBQb3NzaWJsZSB2YWx1ZXM6IGBNT05USExZYCwgYEJJLVdFRUtMWWAsIGBXRUVLTFlgLCBgU0VNSS1NT05USExZYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheXN0dWJQYXlGcmVxdWVuY3kge1xuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQmlXZWVrbHkgPSAnQkktV0VFS0xZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JLU1PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIGluY29tZSBlYXJuZWQgeWVhciB0byBkYXRlLCBhcyBiYXNlZCBvbiBwYXlzdHViIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBncm9zcyBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgbmV0ICh0YWtlIGhvbWUpIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgbmV0X2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVt4oCZcyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFNvbWUgSXRlbXMgaGF2ZSBleHBsaWNpdCBleHBpcmF0aW9uIHRpbWVzIGFuZCB3ZSB0cnkgdG8gcmVsYXkgdGhpcyB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBzZXJ2aWNlIGRpc3J1cHRpb24uIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTW9zdCByZWxldmFudCBmb3IgcGVyc29uYWwgZmluYW5jZSB1c2UgY2FzZXMsIGJ1dCBub3QgbGltaXRlZCB0byBzdWNoIHVzZSBjYXNlcy4gIFNlZSB0aGUgW2B0YXhvbm9teSBDU1YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIElmIHlvdSBhcmUgbWlncmF0aW5nIHRvIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBmcm9tIHRoZSBsZWdhY3kgY2F0ZWdvcmllcywgYWxzbyByZWZlciB0byB0aGUgW2BtaWdyYXRpb24gZ3VpZGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9wZmMtbWlncmF0aW9uLykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgaGlnaCBsZXZlbCBjYXRlZ29yeSB0aGF0IGNvbW11bmljYXRlcyB0aGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgcHJpbWFyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZ3JhbnVsYXIgY2F0ZWdvcnkgY29udmV5aW5nIHRoZSB0cmFuc2FjdGlvblxcJ3MgaW50ZW50LiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNhdGVnb3JpZXMgYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LiAgYFZFUllfSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTglIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBMT1dgOiBUaGlzIGNhdGVnb3J5IG1heSByZWZsZWN0IHRoZSBpbnRlbnQsIGJ1dCB0aGVyZSBtYXkgYmUgb3RoZXIgY2F0ZWdvcmllcyB0aGF0IGFyZSBtb3JlIGFjY3VyYXRlLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHBob25lIG51bWJlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBwaG9uZSBudW1iZXIgYXMgdGhlIHByaW1hcnkgbnVtYmVyIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBQaG9uZU51bWJlclR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBob25lTnVtYmVyVHlwZUVudW0ge1xuICAgIEhvbWUgPSAnaG9tZScsXG4gICAgV29yayA9ICd3b3JrJyxcbiAgICBPZmZpY2UgPSAnb2ZmaWNlJyxcbiAgICBNb2JpbGUgPSAnbW9iaWxlJyxcbiAgICBNb2JpbGUxID0gJ21vYmlsZTEnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIHBob25lIG51bWJlciBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIHBob25lIG51bWJlciBvbiB0aGUgYWNjb3VudCBhdCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyTWF0Y2hTY29yZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIHBob25lIG51bWJlci4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktNzAgaXMgYSBwYXJ0aWFsIG1hdGNoIChtYXRjaGluZyB0aGUgc2FtZSBwaG9uZSBudW1iZXIgd2l0aCBleHRlbnNpb24gYWdhaW5zdCBvbmUgd2l0aG91dCBleHRlbnNpb24sIGV0Yy4pLCBhbnl0aGluZyBiZWxvdyA3MCBpcyBjb25zaWRlcmVkIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgcGhvbmUgbnVtYmVyIGlzIG1pc3NpbmcgZnJvbSBlaXRoZXIgdGhlIEFQSSBvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIHRoaXMgaXMgbnVsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlck1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgcGhvbmUgbnVtYmVyIGlzIGEgcGhvbmUgbGluZSBvciBhIGZheCBsaW5lLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGhvbmVUeXBlIHtcbiAgICBQaG9uZSA9ICdwaG9uZScsXG4gICAgRmF4ID0gJ2ZheCdcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpZGVudGl0eSBkb2N1bWVudCBkZXRlY3RlZCBpbiB0aGUgaW1hZ2VzIHByb3ZpZGVkLiBXaWxsIGFsd2F5cyBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICAgIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBkcml2ZXJcXCdzIGxpY2Vuc2UgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnksIGVzdGFibGlzaGluZyBpZGVudGl0eSB3aXRob3V0IGFueSBndWFyYW50ZWUgYXMgdG8gY2l0aXplbnNoaXAsIGFuZCBncmFudGluZyBkcml2aW5nIHByaXZpbGVnZXMgICAgYGlkX2NhcmRgIC0gQSBnZW5lcmFsIG5hdGlvbmFsIGlkZW50aWZpY2F0aW9uIGNhcmQsIGRpc3RpbmN0IGZyb20gZHJpdmVyXFwncyBsaWNlbnNlcyBhcyBpdCBvbmx5IGVzdGFibGlzaGVzIGlkZW50aXR5ICAgIGBwYXNzcG9ydGAgLSBBIHRyYXZlbCBwYXNzcG9ydCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBmb3Igb25lIG9mIGl0cyBjaXRpemVucyAgICBgcmVzaWRlbmNlX3Blcm1pdF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnRlbXBvcmFyaWx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGByZXNpZGVudF9jYXJkYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gdG8gPGVtPnBlcm1hbmVudGx5PC9lbT4gcmVzaWRlIHRoZXJlICAgIGB2aXNhYCAtIEFuIGlkZW50aXR5IGRvY3VtZW50IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IHBlcm1pdHRpbmcgYSBmb3JlaWduIGNpdGl6ZW4gZW50cnkgZm9yIGEgc2hvcnQgZHVyYXRpb24gYW5kIGZvciBhIHNwZWNpZmljIHB1cnBvc2UsIHR5cGljYWxseSBubyBsb25nZXIgdGhhbiA2IG1vbnRocyAgTm90ZTogVGhpcyB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIElEIHR5cGUgdGhhdCB0aGUgdXNlciBzZWxlY3RzIHdpdGhpbiBMaW5rLiBGb3IgZXhhbXBsZSwgaWYgdGhleSBzZWxlY3QgXFxcIkRyaXZlclxcJ3MgTGljZW5zZVxcXCIgYnV0IHRoZW4gc3VibWl0IGEgcGljdHVyZSBvZiBhIHBhc3Nwb3J0LCB0aGlzIGZpZWxkIHdpbGwgc2F5IGBwYXNzcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeSB7XG4gICAgRHJpdmVyc0xpY2Vuc2UgPSAnZHJpdmVyc19saWNlbnNlJyxcbiAgICBJZENhcmQgPSAnaWRfY2FyZCcsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFJlc2lkZW5jZVBlcm1pdENhcmQgPSAncmVzaWRlbmNlX3Blcm1pdF9jYXJkJyxcbiAgICBSZXNpZGVudENhcmQgPSAncmVzaWRlbnRfY2FyZCcsXG4gICAgVmlzYSA9ICd2aXNhJ1xufVxuXG4vKipcbiAqIERhdGEgZXh0cmFjdGVkIGZyb20gYSB1c2VyLXN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQWxwaGEtbnVtZXJpYyBJRCBudW1iZXIgZXh0cmFjdGVkIHZpYSBPQ1IgZnJvbSB0aGUgdXNlclxcJ3MgZG9jdW1lbnQgaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogUGh5c2ljYWxEb2N1bWVudENhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaXNzdWluZ19jb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpc3N1aW5nX3JlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogQW5hbHlzaXMgb2YgdGhlIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudE5hbWVNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBEb2N1bWVudE5hbWVNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50RGF0ZU9mQmlydGhNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHBpcmF0aW9uRGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogRXhwaXJhdGlvbkRhdGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lzc3VpbmdDb3VudHJ5fVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgaXNzdWluZ19jb3VudHJ5OiBJc3N1aW5nQ291bnRyeTtcbn1cbi8qKlxuICogVVJMcyBmb3IgZG93bmxvYWRpbmcgb3JpZ2luYWwgYW5kIGNyb3BwZWQgaW1hZ2VzIGZvciB0aGlzIGRvY3VtZW50IHN1Ym1pc3Npb24uIFRoZSBVUkxzIGFyZSBkZXNpZ25lZCB0byBvbmx5IGFsbG93IGRvd25sb2FkaW5nLCBub3QgaG90IGxpbmtpbmcsIHNvIHRoZSBVUkwgd2lsbCBvbmx5IHNlcnZlIHRoZSBkb2N1bWVudCBpbWFnZSBmb3IgNjAgc2Vjb25kcyBiZWZvcmUgZXhwaXJpbmcuIFRoZSBleHBpcmF0aW9uIHRpbWUgaXMgNjAgc2Vjb25kcyBhZnRlciB0aGUgYEdFVGAgcmVxdWVzdCBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuIEEgbmV3IGV4cGlyaW5nIFVSTCBpcyBnZW5lcmF0ZWQgd2l0aCBlYWNoIHJlcXVlc3QsIHNvIHlvdSBjYW4gYWx3YXlzIHJlcmVxdWVzdCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaWYgb25lIG9mIHlvdXIgVVJMcyBleHBpcmVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIHVuY3JvcHBlZCBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9mcm9udDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyB0aGUgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfYmFjazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3BwZWQgaW1hZ2UgY29udGFpbmluZyBqdXN0IHRoZSBmcm9udCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGNyb3BwZWRfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50IHdhcyBub3QgY29sbGVjdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wIG9mIGp1c3QgdGhlIHVzZXJcXCdzIGZhY2UgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYSBmYWNlIHBob3RvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBmYWNlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBXZSB1c2Ugc3RhbmRhcmQgSFRUUCByZXNwb25zZSBjb2RlcyBmb3Igc3VjY2VzcyBhbmQgZmFpbHVyZSBub3RpZmljYXRpb25zLCBhbmQgb3VyIGVycm9ycyBhcmUgZnVydGhlciBjbGFzc2lmaWVkIGJ5IGBlcnJvcl90eXBlYC4gSW4gZ2VuZXJhbCwgMjAwIEhUVFAgY29kZXMgY29ycmVzcG9uZCB0byBzdWNjZXNzLCA0MFggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBmYWlsdXJlcywgYW5kIDUwWCBjb2RlcyBhcmUgZm9yIFBsYWlkLXJlbGF0ZWQgaXNzdWVzLiBBbiBJdGVtIHdpdGggYSBub24tYG51bGxgIGVycm9yIG9iamVjdCB3aWxsIG9ubHkgYmUgcGFydCBvZiBhbiBBUEkgcmVzcG9uc2Ugd2hlbiBjYWxsaW5nIGAvaXRlbS9nZXRgIHRvIHZpZXcgSXRlbSBzdGF0dXMuIE90aGVyd2lzZSwgZXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZDsgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBhbiBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRFcnJvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGxhaWRFcnJvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uICBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgQXNzZXRzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgb25seSBiZSBwcm92aWRlZCBmb3IgdGhlIGBlcnJvcl90eXBlYCBgQVNTRVRfUkVQT1JUX0VSUk9SYC4gYGNhdXNlc2Agd2lsbCBhbHNvIG5vdCBiZSBwb3B1bGF0ZWQgaW5zaWRlIGFuIGVycm9yIG5lc3RlZCB3aXRoaW4gYSBgd2FybmluZ2Agb2JqZWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgY2F1c2VzPzogQXJyYXk8YW55PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLiBUaGlzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keSB3aGVuIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3VnZ2VzdGVkX2FjdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGxhaWRFcnJvclR5cGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ0lOVkFMSURfUkVRVUVTVCcsXG4gICAgSW52YWxpZFJlc3VsdCA9ICdJTlZBTElEX1JFU1VMVCcsXG4gICAgSW52YWxpZElucHV0ID0gJ0lOVkFMSURfSU5QVVQnLFxuICAgIEluc3RpdHV0aW9uRXJyb3IgPSAnSU5TVElUVVRJT05fRVJST1InLFxuICAgIFJhdGVMaW1pdEV4Y2VlZGVkID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgIEFwaUVycm9yID0gJ0FQSV9FUlJPUicsXG4gICAgSXRlbUVycm9yID0gJ0lURU1fRVJST1InLFxuICAgIEFzc2V0UmVwb3J0RXJyb3IgPSAnQVNTRVRfUkVQT1JUX0VSUk9SJyxcbiAgICBSZWNhcHRjaGFFcnJvciA9ICdSRUNBUFRDSEFfRVJST1InLFxuICAgIE9hdXRoRXJyb3IgPSAnT0FVVEhfRVJST1InLFxuICAgIFBheW1lbnRFcnJvciA9ICdQQVlNRU5UX0VSUk9SJyxcbiAgICBCYW5rVHJhbnNmZXJFcnJvciA9ICdCQU5LX1RSQU5TRkVSX0VSUk9SJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25FcnJvciA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX0VSUk9SJyxcbiAgICBNaWNyb2RlcG9zaXRzRXJyb3IgPSAnTUlDUk9ERVBPU0lUU19FUlJPUidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQbGF0Zm9ybUlkc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1JZHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIGVtcGxveWVlX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYW4gZW1wbG95ZWUgYXMgZ2l2ZW4gYnkgdGhlaXIgcGF5cm9sbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW1wbG95ZWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBvc2l0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JOdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFByb2Nlc3Nvck51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudElkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudElkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIElmIFtBY2NvdW50IFNlbGVjdCB2Ml0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2N1c3RvbWl6YXRpb24vI2FjY291bnQtc2VsZWN0KSBpcyBlbmFibGVkLCB0aGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudGAuIFRoZSBpZGVudGlmeWluZyBudW1iZXIgdHlwZSAoQUNILCBFRlQsIElCQU4sIG9yIEJBQ1MpIHVzZWQgd2lsbCBkZXBlbmQgb24gdGhlIGNvdW50cnkgb2YgdGhlIGFjY291bnQuIEFuIGFjY291bnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBudW1iZXIgdHlwZS4gSWYgYSBwYXJ0aWN1bGFyIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIGlzIG5vdCB1c2VkIGJ5IHRoZSBgYWNjb3VudGAgZm9yIHdoaWNoIGF1dGggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIGEgbnVsbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQUNITnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGFjaD86IE51bWJlcnNBQ0hOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNFRlROdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgZWZ0PzogTnVtYmVyc0VGVE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBiYWNzPzogTnVtYmVyc0JBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgaXMgdXBkYXRlZC4gVGhpcyBpbmNsdWRlcyB3aGVuIGEgbmV3IHJlY3VycmluZyBzdHJlYW0gaXMgZGV0ZWN0ZWQgb3Igd2hlbiBhIG5ldyB0cmFuc2FjdGlvbiBpcyBhZGRlZCB0byBhbiBleGlzdGluZyByZWN1cnJpbmcgc3RyZWFtLiBUaGUgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYCB3ZWJob29rIHdpbGwgYWxzbyBmaXJlIHdoZW4gb25lIG9yIG1vcmUgYXR0cmlidXRlcyBvZiB0aGUgcmVjdXJyaW5nIHN0cmVhbSBjaGFuZ2VzLCB3aGljaCBpcyB1c3VhbGx5IGEgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbiwgdXBkYXRlLCBvciByZW1vdmFsIG9mIHRyYW5zYWN0aW9ucyB0byB0aGUgc3RyZWFtLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSB1cGRhdGVkIGRhdGEgY2FuIGJlIGZldGNoZWQgZnJvbSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIElEL2lkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFRoZSBtYXggbGVuZ3RoIGZvciB0aGlzIGZpZWxkIGlzIDM2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZW5kIHVzZXIgaXMgcHJlc2VudCB3aGlsZSBpbml0aWF0aW5nIHRoZSBBQ0ggdHJhbnNmZXIgYW5kIHRoZSBlbmRwb2ludCBpcyBiZWluZyBjYWxsZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlIChmb3IgZXhhbXBsZSwgd2hlbiB0aGUgQUNIIHRyYW5zZmVyIGlzIHNjaGVkdWxlZCBhbmQgdGhlIGVuZCB1c2VyIGlzIG5vdCBwcmVzZW50LCBvciB5b3UgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHRoZSBBQ0ggdHJhbnNmZXIgYnV0IGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBOYWNoYSBmaWxlIGZvciBBQ0ggcHJvY2Vzc2luZykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfcHJlc2VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgSXRlbXMuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogKip0cnVlKiogaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHJlY3VycmluZyB0cmFuc2FjdGlvbjsgKipmYWxzZSoqIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsU2NvcmVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2NvcmVzOiBTaWduYWxTY29yZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXR1cm5zIGZyb20geW91ciBwYXltZW50IHByb2Nlc3NvcnMsIGluIElTTyA4NjAxIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybmVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2VudCB0byBTdHJpcGUgZm9yIHVzZSBpbiBtYWtpbmcgQVBJIGNhbGxzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyaXBlX2JhbmtfYWNjb3VudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB0aGUgb2xkZXIgd2ViaG9va3MgYElOSVRJQUxfVVBEQVRFYCwgYEhJU1RPUklDQUxfVVBEQVRFYCwgYERFRkFVTFRfVVBEQVRFYCwgYW5kIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGAsIHdoaWNoIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3IgYW4gSXRlbSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIHRyYW5zYWN0aW9ucyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB5b3UgYXJlIGludGVncmF0aW5nIHdpdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yOiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW0ge1xuICAgIER3b2xsYSA9ICdkd29sbGEnLFxuICAgIEdhbGlsZW8gPSAnZ2FsaWxlbycsXG4gICAgTW9kZXJuVHJlYXN1cnkgPSAnbW9kZXJuX3RyZWFzdXJ5JyxcbiAgICBPY3JvbHVzID0gJ29jcm9sdXMnLFxuICAgIFByaW1lVHJ1c3QgPSAncHJpbWVfdHJ1c3QnLFxuICAgIFZlc3RhID0gJ3Zlc3RhJyxcbiAgICBEcml2ZXdlYWx0aCA9ICdkcml2ZXdlYWx0aCcsXG4gICAgVm9wYXkgPSAndm9wYXknLFxuICAgIEFjaHEgPSAnYWNocScsXG4gICAgQ2hlY2sgPSAnY2hlY2snLFxuICAgIENoZWNrYm9vayA9ICdjaGVja2Jvb2snLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNpbGFNb25leSA9ICdzaWxhX21vbmV5JyxcbiAgICBSaXplID0gJ3JpemUnLFxuICAgIFN2YkFwaSA9ICdzdmJfYXBpJyxcbiAgICBVbml0ID0gJ3VuaXQnLFxuICAgIFd5cmUgPSAnd3lyZScsXG4gICAgTGl0aGljID0gJ2xpdGhpYycsXG4gICAgQWxwYWNhID0gJ2FscGFjYScsXG4gICAgQXN0cmEgPSAnYXN0cmEnLFxuICAgIE1vb3YgPSAnbW9vdicsXG4gICAgVHJlYXN1cnlQcmltZSA9ICd0cmVhc3VyeV9wcmltZScsXG4gICAgTWFycWV0YSA9ICdtYXJxZXRhJyxcbiAgICBDaGVja291dCA9ICdjaGVja291dCcsXG4gICAgU29saWQgPSAnc29saWQnLFxuICAgIEhpZ2hub3RlID0gJ2hpZ2hub3RlJyxcbiAgICBHZW1pbmkgPSAnZ2VtaW5pJyxcbiAgICBBcGV4Q2xlYXJpbmcgPSAnYXBleF9jbGVhcmluZycsXG4gICAgR3VzdG8gPSAnZ3VzdG8nLFxuICAgIEFkeWVuID0gJ2FkeWVuJyxcbiAgICBBdG9taWMgPSAnYXRvbWljJyxcbiAgICBJMmMgPSAnaTJjJyxcbiAgICBXZXBheSA9ICd3ZXBheScsXG4gICAgUmlza2lmaWVkID0gJ3Jpc2tpZmllZCcsXG4gICAgVXRiID0gJ3V0YicsXG4gICAgQWRwUm9sbCA9ICdhZHBfcm9sbCcsXG4gICAgRm9ydHJlc3NUcnVzdCA9ICdmb3J0cmVzc190cnVzdCcsXG4gICAgQm9uZCA9ICdib25kJyxcbiAgICBCYWtrdCA9ICdiYWtrdCcsXG4gICAgVGVhbCA9ICd0ZWFsJyxcbiAgICBaZXJvSGFzaCA9ICd6ZXJvX2hhc2gnLFxuICAgIFRhYmFQYXkgPSAndGFiYV9wYXknLFxuICAgIEtub3QgPSAna25vdCcsXG4gICAgU2FyZGluZSA9ICdzYXJkaW5lJyxcbiAgICBBbGxveSA9ICdhbGxveSdcbn1cblxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYCBhbmQgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9jZXNzb3JfdG9rZW5gIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBieSB0aGUgUGxhaWQgcGFydG5lciB0byBtYWtlIEFQSSByZXF1ZXN0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoYXQgdGhlIHByb2Nlc3NvciBoYXMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGluY2x1ZGluZyBmdXR1cmUgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3Qgd2lsbCBncmFudCBhY2Nlc3MgdG8gYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhIHByb2Nlc3NvciB1cGRhdGVzIHRoZSB3ZWJob29rIFVSTCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4gdmlhIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgUFJPQ0VTU09SX1RPS0VOYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRvIHJlbW92ZSBhIHdlYmhvb2sgZnJvbSBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IHRvIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlciwgb3Igc3VibWl0IGEgW1N1cHBvcnQgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3Byb2R1Y3QtZnVuY3Rpb25hbGl0eSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkZXBvc2l0b3J5IHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGV4cGVuc2UgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbiBzdHJlYW1zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB3ZXJlIHVwZGF0ZWQgb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZXRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU19SRU1PVkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgdHJhbnNhY3Rpb25faWRzYCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlbW92ZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUHJvdmlkaW5nIGl0IHdpbGwgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIG9ubHkgcmV0dXJuIGNoYW5nZXMgYWZ0ZXIgdGhpcyB1cGRhdGUuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiB1cGRhdGVzIHdpbGwgYmUgcmV0dXJuZWQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LWFkZGVkIHRyYW5zYWN0aW9ucyBvbiB0aGUgaXRlbS4gTm90ZTogVGhlIHVwcGVyLWJvdW5kIGxlbmd0aCBvZiB0aGlzIGN1cnNvciBpcyAyNTYgY2hhcmFjdGVycyBvZiBiYXNlNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZGVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIG9uIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS4gVGhlIGN1cnNvciBvYnRhaW5lZCBhZnRlciBhbGwgcGFnZXMgaGF2ZSBiZWVuIHB1bGxlZCAoaW5kaWNhdGVkIGJ5IGBoYXNfbW9yZWAgYmVpbmcgYGZhbHNlYCkgd2lsbCBiZSB2YWxpZCBmb3IgYXQgbGVhc3QgMSB5ZWFyLiBUaGlzIGN1cnNvciBzaG91bGQgYmUgcGVyc2lzdGVkIGZvciBsYXRlciBjYWxscy4gSWYgdHJhbnNhY3Rpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcHJvZHVjdCBhY2Nlc3MgYmVpbmcgcmVxdWVzdGVkLiBVc2VkIHRvIG9yIGRpc2FsbG93IHByb2R1Y3QgYWNjZXNzIGFjcm9zcyBhbGwgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBhbGwgcHJvZHVjdHMgYWxsb3dlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdEFjY2Vzc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdEFjY2VzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRoZSBJZGVudGl0eSBwcm9kdWN0IChuYW1lLCBlbWFpbCwgcGhvbmUsIGFkZHJlc3MpLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBhY2NvdW50IG51bWJlciBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRyYW5zYWN0aW9uIGRldGFpbHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19kZXRhaWxzX3RyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfcm91dGluZ19udW1iZXJcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19yb3V0aW5nX251bWJlcj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3RheF9zdGF0ZW1lbnRzXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfdGF4X3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImN1c3RvbWVyc19wcm9maWxlc1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGN1c3RvbWVyc19wcm9maWxlcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGBBQ0NFU1NfTk9UX0dSQU5URURgIGVycm9yIGlzIGhpdCBmb3IgQXV0aC4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgYXV0aGAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBBdXRoZW50aWNhdGlvbiBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1BFUk1JU1NJT05TX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIElkZW50aXR5LiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IHB1dHRpbmcgdGhlIHVzZXIgdGhyb3VnaCB1cGRhdGUgbW9kZSB3aXRoIGBpZGVudGl0eWAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBJZGVudGl0eSBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXR1cyBoZWFsdGggb2YgYSByZXF1ZXN0IHR5cGUuIEF1dGggcmVxdWVzdHMsIEJhbGFuY2UgcmVxdWVzdHMsIElkZW50aXR5IHJlcXVlc3RzLCBJbnZlc3RtZW50cyByZXF1ZXN0cywgTGlhYmlsaXRpZXMgcmVxdWVzdHMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBhbmQgSXRlbSBsb2dpbnMgZWFjaCBoYXZlIHRoZWlyIG93biBzdGF0dXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBgYnJlYWtkb3duYCBvYmplY3QsIHdoaWNoIHByb3ZpZGVzIG1vcmUgZ3JhbnVsYXIgaW5zdGl0dXRpb24gaGVhbHRoIGRhdGEuICBgSEVBTFRIWWA6IHRoZSBtYWpvcml0eSBvZiByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgREVHUkFERURgOiBvbmx5IHNvbWUgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERPV05gOiBhbGwgcmVxdWVzdHMgYXJlIGZhaWxpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdHRlZCB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3RhdHVzIGNoYW5nZSBmb3IgdGhlIGluc3RpdHV0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfY2hhbmdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXNCcmVha2Rvd259XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IFByb2R1Y3RTdGF0dXNCcmVha2Rvd247XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c1N0YXR1c0VudW0ge1xuICAgIEhlYWx0aHkgPSAnSEVBTFRIWScsXG4gICAgRGVncmFkZWQgPSAnREVHUkFERUQnLFxuICAgIERvd24gPSAnRE9XTidcbn1cblxuLyoqXG4gKiBBIGRldGFpbGVkIGJyZWFrZG93biBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIHBlcmZvcm1hbmNlIGZvciBhIHJlcXVlc3QgdHlwZS4gVGhlIHZhbHVlcyBmb3IgYHN1Y2Nlc3NgLCBgZXJyb3JfcGxhaWRgLCBhbmQgYGVycm9yX2luc3RpdHV0aW9uYCBzdW0gdG8gMS4gVGhlIHRpbWUgcmFuZ2UgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGJyZWFrZG93biBtYXkgcmFuZ2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgZmV3IG1pbnV0ZXMgdG8gdGhlIHBhc3Qgc2l4IGhvdXJzLiBJbiBnZW5lcmFsLCBzbWFsbGVyIGluc3RpdHV0aW9ucyB3aWxsIHNob3cgc3RhdHVzIHRoYXQgd2FzIGNhbGN1bGF0ZWQgb3ZlciBhIGxvbmdlciBwZXJpb2Qgb2YgdGltZS4gRm9yIEludmVzdG1lbnQgdXBkYXRlcywgd2hpY2ggYXJlIHJlZnJlc2hlZCBsZXNzIGZyZXF1ZW50bHksIHRoZSBwZXJpb2QgYXNzZXNzZWQgbWF5IGJlIDI0IGhvdXJzIG9yIG1vcmUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbSW5zdGl0dXRpb24gc3RhdHVzIGRldGFpbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jaW5zdGl0dXRpb24tc3RhdHVzLWRldGFpbHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgc3VjY2Vzc2Z1bCwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgc3VjY2VzczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBQbGFpZCBpc3N1ZSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX3BsYWlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGlzc3VlIGluIHRoZSBpbnN0aXR1dGlvblxcJ3Mgc3lzdGVtLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9pbnN0aXR1dGlvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVmcmVzaF9pbnRlcnZhbGAgbWF5IGJlIGBERUxBWUVEYCBvciBgU1RPUFBFRGAgZXZlbiB3aGVuIHRoZSBzdWNjZXNzIHJhdGUgaXMgaGlnaC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkIGZvciBUcmFuc2FjdGlvbnMgc3RhdHVzIGJyZWFrZG93bnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHJlZnJlc2hfaW50ZXJ2YWw/OiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bSB7XG4gICAgTm9ybWFsID0gJ05PUk1BTCcsXG4gICAgRGVsYXllZCA9ICdERUxBWUVEJyxcbiAgICBTdG9wcGVkID0gJ1NUT1BQRUQnXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgYW4gaW5zdGl0dXRpb24gY2FuIHN1cHBvcnQuIEFsbCBJdGVtcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYXQgbGVhc3Qgb25lIHByb2R1Y3QuIFRoZSBCYWxhbmNlIHByb2R1Y3QgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdHMge1xuICAgIEFzc2V0cyA9ICdhc3NldHMnLFxuICAgIEF1dGggPSAnYXV0aCcsXG4gICAgQmFsYW5jZSA9ICdiYWxhbmNlJyxcbiAgICBJZGVudGl0eSA9ICdpZGVudGl0eScsXG4gICAgSWRlbnRpdHlNYXRjaCA9ICdpZGVudGl0eV9tYXRjaCcsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEludmVzdG1lbnRzQXV0aCA9ICdpbnZlc3RtZW50c19hdXRoJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUGF5bWVudEluaXRpYXRpb24gPSAncGF5bWVudF9pbml0aWF0aW9uJyxcbiAgICBJZGVudGl0eVZlcmlmaWNhdGlvbiA9ICdpZGVudGl0eV92ZXJpZmljYXRpb24nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdERldGFpbHMgPSAnY3JlZGl0X2RldGFpbHMnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbiA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uJyxcbiAgICBEZXBvc2l0U3dpdGNoID0gJ2RlcG9zaXRfc3dpdGNoJyxcbiAgICBTdGFuZGluZ09yZGVycyA9ICdzdGFuZGluZ19vcmRlcnMnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBFbXBsb3ltZW50ID0gJ2VtcGxveW1lbnQnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9ucyA9ICdyZWN1cnJpbmdfdHJhbnNhY3Rpb25zJyxcbiAgICBTaWduYWwgPSAnc2lnbmFsJyxcbiAgICBTdGF0ZW1lbnRzID0gJ3N0YXRlbWVudHMnXG59XG5cbi8qKlxuICogVGhlIHZhbGlkIG5hbWUgbWF0Y2hpbmcgc2Vuc2l0aXZpdHkgY29uZmlndXJhdGlvbnMgZm9yIGEgc2NyZWVuaW5nIHByb2dyYW0uIE5vdGUgdGhhdCB3aGlsZSBjZXJ0YWluIG1hdGNoaW5nIHRlY2huaXF1ZXMgbWF5IGJlIG1vcmUgcHJldmFsZW50IG9uIGxlc3Mgc3RyaWN0IHNldHRpbmdzLCBhbGwgbWF0Y2hpbmcgYWxnb3JpdGhtcyBhcmUgZW5hYmxlZCBmb3IgZXZlcnkgc2Vuc2l0aXZpdHkuICBgY29hcnNlYCAtIFNlZSBtb3JlIHBvdGVudGlhbCBtYXRjaGVzLiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgc2VlIG1vcmUgYnJvYWQgcGhvbmV0aWMgbWF0Y2hlcyBhY3Jvc3MgYWxwaGFiZXRzIHRoYXQgbWFrZSBtaXNzaW5nIGEgcG90ZW50aWFsIGhpdCB2ZXJ5IHVubGlrZWx5LiBUaGlzIHNldHRpbmcgaXMgbm9pc2llciBhbmQgd2lsbCByZXF1aXJlIG1vcmUgbWFudWFsIHJldmlldy4gIGBiYWxhbmNlZGAgLSBBIGdvb2QgZGVmYXVsdCBmb3IgbW9zdCBjb21wYW5pZXMuIFRoaXMgc2Vuc2l0aXZpdHkgaXMgYmFsYW5jZWQgdG8gc2hvdyBoaWdoIHF1YWxpdHkgaGl0cyB3aXRoIHJlZHVjZWQgbm9pc2UuICBgc3RyaWN0YCAtIEFnZ3Jlc3NpdmUgZmFsc2UgcG9zaXRpdmUgcmVkdWN0aW9uLiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgcmVxdWlyZSBuYW1lcyB0byBiZSBtb3JlIHNpbWlsYXIgdGhhbiBgY29hcnNlYCBhbmQgYGJhbGFuY2VkYCBzZXR0aW5ncywgcmVseWluZyBsZXNzIG9uIHBob25ldGljcywgd2hpbGUgc3RpbGwgYWNjb3VudGluZyBmb3IgY2hhcmFjdGVyIHRyYW5zcG9zaXRpb25zLCBtaXNzaW5nIHRva2VucywgYW5kIG90aGVyIGNvbW1vbiBwZXJtdXRhdGlvbnMuICBgZXhhY3RgIC0gTWF0Y2hlcyBtdXN0IGJlIG5lYXJseSBleGFjdC4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIG9ubHkgc2hvdyBoaXRzIHdpdGggZXhhY3Qgb3IgbmVhcmx5IGV4YWN0IG5hbWUgbWF0Y2hlcyB3aXRoIG9ubHkgYmFzaWMgY29ycmVjdGlvbiBzdWNoIGFzIGV4dHJhbmVvdXMgc3ltYm9scyBhbmQgY2FwaXRhbGl6YXRpb24uIFRoaXMgc2V0dGluZyBpcyBnZW5lcmFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UgaGF2ZSBhIHZlcnkgc3BlY2lmaWMgdXNlIGNhc2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5IHtcbiAgICBDb2Fyc2UgPSAnY29hcnNlJyxcbiAgICBCYWxhbmNlZCA9ICdiYWxhbmNlZCcsXG4gICAgU3RyaWN0ID0gJ3N0cmljdCcsXG4gICAgRXhhY3QgPSAnZXhhY3QnXG59XG5cbi8qKlxuICogVGhlIGVtcGxveWVlXFwncyBlc3RpbWF0ZWQgYW5udWFsIHNhbGFyeSwgYXMgZGVyaXZlZCBmcm9tIGluZm9ybWF0aW9uIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBuZXR3b3JrIHByb3h5IGlzIHByZXNlbnQgYW5kIGlmIHNvIHdoYXQgdHlwZSBpdCBpcy4gIGBub25lX2RldGVjdGVkYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgbm90IG9uIGEgZGV0ZWN0YWJsZSBwcm94eSBuZXR3b3JrLiAgYHRvcmAgaW5kaWNhdGVzIHRoZSB1c2VyIHdhcyB1c2luZyBhIFRvciBicm93c2VyLCB3aGljaCBzZW5kcyBlbmNyeXB0ZWQgdHJhZmZpYyBvbiBhIGRlY2VudHJhbGl6ZWQgbmV0d29yayBhbmQgaXMgc29tZXdoYXQgc2ltaWxhciB0byBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspLiAgYHZwbmAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgVlBOIChWaXJ0dWFsIFByaXZhdGUgTmV0d29yaykgIGB3ZWJfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIG1heSBhbGxvdyB0aGVtIHRvIGNvbmNlYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGVpciBJUCBhZGRyZXNzIG9yIG90aGVyIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgYHB1YmxpY19wcm94eWAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgcHVibGljIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gYSB3ZWIgcHJveHkgYnV0IGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdXNlcnMuIFRoaXMgbWF5IGFsbG93IG11bHRpcGxlIHVzZXJzIHRvIGFwcGVhciBhcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgSVAgYWRkcmVzcyBmb3IgaW5zdGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm94eVR5cGUge1xuICAgIE5vbmVEZXRlY3RlZCA9ICdub25lX2RldGVjdGVkJyxcbiAgICBUb3IgPSAndG9yJyxcbiAgICBWcG4gPSAndnBuJyxcbiAgICBXZWJQcm94eSA9ICd3ZWJfcHJveHknLFxuICAgIFB1YmxpY1Byb3h5ID0gJ3B1YmxpY19wcm94eSdcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCB3YXMgZmxhZ2dlZCBieSBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtLCBhbmQgcmVxdWlyZXMgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gdG8gZW5zdXJlIHRoZXkgYXJlIG5vdCBhIGJvdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9FUlJPUlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUkVDQVBUQ0hBX1JFUVVJUkVEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNDAwXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGh0dHBfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHNvbHZlIGEgR29vZ2xlIHJlQ0FQVENIQSBjaGFsbGVuZ2UgaW4gdGhlIExpbmsgUmVjYXB0Y2hhIHBhbmUuIElmIHRoZXkgc29sdmUgdGhlIGNoYWxsZW5nZSBzdWNjZXNzZnVsbHksIHRoZSB1c2VyXFwncyByZXF1ZXN0IGlzIHJlc3VibWl0dGVkIGFuZCB0aGV5IGFyZSBkaXJlY3RlZCB0byB0aGUgbmV4dCBJdGVtIGNyZWF0aW9uIHN0ZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGxpbmtfdXNlcl9leHBlcmllbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBkZXRlY3RzIGFidXNpdmUgdHJhZmZpYyBhbmQgY29uc2lkZXJzIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRocm91Z2hvdXQgSXRlbSBjcmVhdGlvbiByZXF1ZXN0cy4gV2hlbiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCByaXNreSBvciBwb3NzaWJseSBmcmF1ZHVsZW50LCBMaW5rIHByZXNlbnRzIGEgcmVDQVBUQ0hBIGZvciB0aGUgdXNlciB0byBzb2x2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgY29tbW9uX2NhdXNlczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpbmsgd2lsbCBhdXRvbWF0aWNhbGx5IGd1aWRlIHlvdXIgdXNlciB0aHJvdWdoIHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgaW5zdHJ1bWVudGluZyBiYXNpYyBmcmF1ZCBtb25pdG9yaW5nIHRvIGRldGVjdCBhbmQgcHJvdGVjdCB5b3VyIHdlYnNpdGUgZnJvbSBzcGFtIGFuZCBhYnVzZS4gIElmIHlvdXIgdXNlciBjYW5ub3QgdmVyaWZ5IHRoZWlyIHNlc3Npb24sIHBsZWFzZSBzdWJtaXQgYSBTdXBwb3J0IHRpY2tldCB3aXRoIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6IGBsaW5rX3Nlc3Npb25faWRgIG9yIGByZXF1ZXN0X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICB0cm91Ymxlc2hvb3Rpbmdfc3RlcHM6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHlvdSBuZWVkIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDUyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc2lnaHRzIHJlbGF0aW5nIHRvIGV4cGVuc2VzIGFuZCBkZXBvc2l0cyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gb2NjdXIgb24gYSBzY2hlZHVsZWQgYmFzaXMsIHN1Y2ggYXMgYml3ZWVrbHksIG1vbnRobHksIG9yIGFubnVhbGx5LiAgQ29tbW9uIGV4YW1wbGVzIGluY2x1ZGUgbG9hbiBwYXltZW50cywgYmlsbCBwYXltZW50cywgc3Vic2NyaXB0aW9ucywgYW5kIHBheXJvbGwgaW5jb21lLiAgVGhpcyBpcyBhIGJldGEgZmllbGQsIGF2YWlsYWJsZSB0byBhbGwgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmVuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmVuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdHJhbnNhY3Rpb24gaXMgcGVyaW9kaWNhbGx5IHJlY3VycmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyZW5jZVxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmVuY2VcbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNhbmNlbGxlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19DQU5DRUxMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYFdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgd2Vlay4gIGBCSVdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgMiB3ZWVrcy4gIGBTRU1JX01PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IHR3aWNlIHBlciBtb250aC4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zLiAgYE1PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IG1vbnRoLiAgYEFOTlVBTExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB5ZWFyLiAgYERBSUxZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBkYXkuICBgRFlOQU1JQ2A6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgdmFyaWVzIGluIHJlY3VycmVuY2UgZnJlcXVlbmN5LiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHN0cmVhbXMgaW4gdGhlIGdpZyBlY29ub215LiAgYFVOS05PV05gOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IGlzblxcJ3QgcmVjdXJyaW5nIGluIG5hdHVyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ0ZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgRHluYW1pYyA9ICdEWU5BTUlDJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudC1wcm92aWRlZCByYXcgZGVzY3JpcHRpb24gb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgb3IgcHJpbWFyeSBjb3VudGVycGFydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gZWFjaCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19hcGFydDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgbmV3IHRyYW5zZmVyIG9mIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIG9yaWdpbmF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfTkVXX1RSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBkb2VzIG5vdCBmaXQgYW55IG9mIHRoZSBwcmUtZGVmaW5lZCBmcmVxdWVuY2llcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBlbmRwb2ludFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBpbmNvbWUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBzdWJzY3JpcHRpb25zLCBiaWxscywgbG9hbiBwYXltZW50cykuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIGZvciBhY2NvdW50cyB0aGF0IGhhdmUgbmV3IG9yIHVwZGF0ZWQgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gIFRoZSBuZXh0IHRyYW5zZmVyIG9yaWdpbmF0aW9uIGRhdGUgYWZ0ZXIgYmFuayBob2xpZGF5IGFkanVzdG1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuICBUaGUgbmV4dCB0cmFuc2ZlciBvcmlnaW5hdGlvbiBkYXRlIGFmdGVyIGJhbmsgaG9saWRheSBhZGp1c3RtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgb24gdGhlIHBsYW5uZWQgZGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19UUkFOU0ZFUl9TS0lQUEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbl9yYXRpb25hbGVfY29kZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxhbm5lZCBkYXRlIG9uIHdoaWNoIFBsYWlkIGlzIHVuYWJsZSB0byBvcmlnaW5hdGUgYSBuZXcgQUNIIHRyYW5zYWN0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBza2lwcGVkX29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHJlbW92ZWQgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVtb3ZlZFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZW1vdmVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcG9ydCB0eXBlLiBJdCBjYW4gYmUgYGFzc2V0YC4gSW5jb21lIHJlcG9ydCB0eXBlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZXBvcnRUeXBlIHtcbiAgICBBc3NldCA9ICdhc3NldCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ0luZm9ybWF0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGJlaGF2aW9yYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2ssIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrQmVoYXZpb3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgdXNlcl9pbnRlcmFjdGlvbnM6IFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgZnJhdWRfcmluZ19kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgYm90X2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWw7XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBib3QgZGV0ZWN0aW9uIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGZyYXVkIHJpbmcgYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG92ZXJhbGwgdXNlciBpbnRlcmFjdGlvbiBzaWduYWxzIG9mIGEgYmVoYXZpb3IgcmlzayBjaGVjay4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIGhvdyBmYW1pbGlhciB0aGUgdXNlciBpcyB3aXRoIHRoZSBwZXJzb25hbCBkYXRhIHRoZXkgcHJvdmlkZSwgYmFzZWQgb24gYSBudW1iZXIgb2Ygc2lnbmFscyB0aGF0IGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHRoZWlyIHNlc3Npb24uICBgZ2VudWluZWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBoaWdoIGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyB1bmxpa2VseS4gIGBuZXV0cmFsYCBpbmRpY2F0ZXMgc29tZSBzaWduYWxzIGFyZSBwcmVzZW50IGluIGJldHdlZW4gYHJpc2t5YCBhbmQgYGdlbnVpbmVgLCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2xlYXIgc2lnbmFscyB0byBkZXRlcm1pbmUgYW4gb3V0Y29tZS4gIGByaXNreWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBsb3cgZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIGxpa2VseS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbCB7XG4gICAgR2VudWluZSA9ICdnZW51aW5lJyxcbiAgICBOZXV0cmFsID0gJ25ldXRyYWwnLFxuICAgIFJpc2t5ID0gJ3Jpc2t5JyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYmVoYXZpb3I6IFJpc2tDaGVja0JlaGF2aW9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbDogUmlza0NoZWNrRW1haWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tQaG9uZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lOiBSaXNrQ2hlY2tQaG9uZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmVzdWx0IHN1bW1hcnkgb2JqZWN0cyBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tEZXZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGV2aWNlczogQXJyYXk8Umlza0NoZWNrRGV2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZGVudGl0eV9hYnVzZV9zaWduYWxzOiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0RldmljZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm94eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3Byb3h5X3R5cGU6IFByb3h5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2Ygc3BhbSBsaXN0cyB0aGUgSVAgYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfc3BhbV9saXN0X2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVUQyBvZmZzZXQgb2YgdGhlIHRpbWV6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVAgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF90aW1lem9uZV9vZmZzZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGVtYWlsYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0VtYWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgaXNfZGVsaXZlcmFibGU6IFJpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb3VudCBvZiBhbGwga25vd24gYnJlYWNoZXMgb2YgdGhpcyBlbWFpbCBhZGRyZXNzIGlmIGtub3duLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgYnJlYWNoX2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGZpcnN0X2JyZWFjaGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIGxhc3RfYnJlYWNoZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX3JlZ2lzdGVyZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2ZyZWVfcHJvdmlkZXI6IFJpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b219XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2N1c3RvbTogUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZG9tYWluX2lzX2Rpc3Bvc2FibGU6IFJpc2tDaGVja0VtYWlsRG9tYWluSXNEaXNwb3NhYmxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHRvcF9sZXZlbF9kb21haW5faXNfc3VzcGljaW91czogUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygb25saW5lIHNlcnZpY2VzIHdoZXJlIHRoaXMgZW1haWwgYWRkcmVzcyBoYXMgYmVlbiBkZXRlY3RlZCB0byBoYXZlIGFjY291bnRzIG9yIG90aGVyIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgbGlua2VkX3NlcnZpY2VzOiBTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT47XG59XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGRvbWFpbiBpcyBjdXN0b20gaWYga25vd24sIGkuZS4gYSBjb21wYW55IGRvbWFpbiBhbmQgbm90IGZyZWUgb3IgZGlzcG9zYWJsZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNDdXN0b20ge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgZG9tYWluIGlzIGxpc3RlZCBhcyBkaXNwb3NhYmxlIGlmIGtub3duLiBEaXNwb3NhYmxlIGRvbWFpbnMgYXJlIG9mdGVuIHVzZWQgdG8gY3JlYXRlIGVtYWlsIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXJ0IG9mIGEgZmFrZSBzZXQgb2YgdXNlciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGUge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyBkb21haW4gaXMgYSBmcmVlIHByb3ZpZGVyIHN1Y2ggYXMgR21haWwgb3IgSG90bWFpbCBpZiBrbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsRG9tYWluSXNGcmVlUHJvdmlkZXIge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBTTVRQLU1YIGNoZWNrIHRvIGNvbmZpcm0gdGhlIGVtYWlsIGFkZHJlc3MgZXhpc3RzIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgdG9wIGxldmVsIGRvbWFpbiwgd2hpY2ggaXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZG9tYWluLCBpcyBmcmF1ZHVsZW50IG9yIHJpc2t5IGlmIGtub3duLiBJbiBtb3N0IGNhc2VzLCBhIHN1c3BpY2lvdXMgdG9wIGxldmVsIGRvbWFpbiBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCBhIGRpc3Bvc2FibGUgb3IgaGlnaC1yaXNrIGRvbWFpbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3QgY2FwdHVyaW5nIGFidXNlIHNpZ25hbHMgcmVsYXRlZCB0byBgaWRlbnRpdHkgYWJ1c2VgLCBlLmcuIHN0b2xlbiBhbmQgc3ludGhldGljIGlkZW50aXR5IGZyYXVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrU3ludGhldGljSWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0lkZW50aXR5QWJ1c2VTaWduYWxzXG4gICAgICovXG4gICAgc3ludGhldGljX2lkZW50aXR5OiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N0b2xlbklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN0b2xlbl9pZGVudGl0eTogUmlza0NoZWNrU3RvbGVuSWRlbnRpdHkgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYSBsaW5rZWQgc2VydmljZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0xpbmtlZFNlcnZpY2Uge1xuICAgIEFwcGxlID0gJ2FwcGxlJyxcbiAgICBFYmF5ID0gJ2ViYXknLFxuICAgIEZhY2Vib29rID0gJ2ZhY2Vib29rJyxcbiAgICBGbGlja3IgPSAnZmxpY2tyJyxcbiAgICBGb3Vyc3F1YXJlID0gJ2ZvdXJzcXVhcmUnLFxuICAgIEdpdGh1YiA9ICdnaXRodWInLFxuICAgIEdvb2dsZSA9ICdnb29nbGUnLFxuICAgIEdyYXZhdGFyID0gJ2dyYXZhdGFyJyxcbiAgICBJbnN0YWdyYW0gPSAnaW5zdGFncmFtJyxcbiAgICBMYXN0Zm0gPSAnbGFzdGZtJyxcbiAgICBMaW5rZWRpbiA9ICdsaW5rZWRpbicsXG4gICAgTWljcm9zb2Z0ID0gJ21pY3Jvc29mdCcsXG4gICAgTXlzcGFjZSA9ICdteXNwYWNlJyxcbiAgICBQaW50ZXJlc3QgPSAncGludGVyZXN0JyxcbiAgICBTa3lwZSA9ICdza3lwZScsXG4gICAgU3BvdGlmeSA9ICdzcG90aWZ5JyxcbiAgICBUZWxlZ3JhbSA9ICd0ZWxlZ3JhbScsXG4gICAgVHVtYmxyID0gJ3R1bWJscicsXG4gICAgVHdpdHRlciA9ICd0d2l0dGVyJyxcbiAgICBWaWJlciA9ICd2aWJlcicsXG4gICAgVmltZW8gPSAndmltZW8nLFxuICAgIFdlaWJvID0gJ3dlaWJvJyxcbiAgICBXaGF0c2FwcCA9ICd3aGF0c2FwcCcsXG4gICAgWWFob28gPSAneWFob28nLFxuICAgIEFpcmJuYiA9ICdhaXJibmInLFxuICAgIEFtYXpvbiA9ICdhbWF6b24nLFxuICAgIEJvb2tpbmcgPSAnYm9va2luZycsXG4gICAgRGlzY29yZCA9ICdkaXNjb3JkJyxcbiAgICBLYWthbyA9ICdrYWthbycsXG4gICAgT2sgPSAnb2snLFxuICAgIFF6b25lID0gJ3F6b25lJyxcbiAgICBMaW5lID0gJ2xpbmUnLFxuICAgIFNuYXBjaGF0ID0gJ3NuYXBjaGF0JyxcbiAgICBaYWxvID0gJ3phbG8nXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgcGhvbmVgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG9ubGluZSBzZXJ2aWNlcyB3aGVyZSB0aGlzIHBob25lIG51bWJlciBoYXMgYmVlbiBkZXRlY3RlZCB0byBoYXZlIGFjY291bnRzIG9yIG90aGVyIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT59XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgbGlua2VkX3NlcnZpY2VzOiBTZXQ8Umlza0NoZWNrTGlua2VkU2VydmljZT47XG59XG4vKipcbiAqIEZpZWxkIGNvbnRhaW5pbmcgdGhlIGRhdGEgdXNlZCBpbiBkZXRlcm1pbmluZyB0aGUgb3V0Y29tZSBvZiB0aGUgc3RvbGVuIGlkZW50aXR5IHJpc2sgY2hlY2suICBDb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczogIGBzY29yZWAgLSBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3RvbGVuIGlkZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMCB0byAxMDAgaW5kaWNhdGluZyB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB1c2VyIGlzIGEgc3RvbGVuIGlkZW50aXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1N0b2xlbklkZW50aXR5XG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbn1cbi8qKlxuICogRmllbGQgY29udGFpbmluZyB0aGUgZGF0YSB1c2VkIGluIGRldGVybWluaW5nIHRoZSBvdXRjb21lIG9mIHRoZSBzeW50aGV0aWMgaWRlbnRpdHkgcmlzayBjaGVjay4gIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOiAgYHNjb3JlYCAtIEEgc2NvcmUgZnJvbSAwIHRvIDEwMCBpbmRpY2F0aW5nIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIHVzZXIgaXMgYSBzeW50aGV0aWMgaWRlbnRpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAwIHRvIDEwMCBpbmRpY2F0aW5nIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIHVzZXIgaXMgYSBzeW50aGV0aWMgaWRlbnRpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSB0cmFuc2FjdGlvbiByZXN1bHQgYWZ0ZXIgZXZhbHVhdGVkIGJ5IHRoZSByZXF1ZXN0ZWQgcmlzayBwcm9maWxlLiBJZiBhIGByaXNrX3Byb2ZpbGVfa2V5YCBpcyBub3QgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkLiBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1Byb2ZpbGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tQcm9maWxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmlzayBwcm9maWxlIHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1Byb2ZpbGVcbiAgICAgKi9cbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2YWx1YXRlZCBvdXRjb21lIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgZm9yIHRoZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIHN0YXR1cz86IFJpc2tTaWduYWxEb2N1bWVudFN0YXR1cztcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogQURvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlXG4gICAgICovXG4gICAgUk9MRV9ERVRBSUw6IFJvbGVEZXRhaWw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUm9sZURldGFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0eVJvbGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlRGV0YWlsXG4gICAgICovXG4gICAgUGFydHlSb2xlVHlwZTogUGFydHlSb2xlVHlwZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Um9sZX1cbiAgICAgKiBAbWVtYmVyb2YgUm9sZXNcbiAgICAgKi9cbiAgICBST0xFOiBSb2xlO1xufVxuLyoqXG4gKiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LiBJZiBwcm92aWRlZCwgdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBVUkwgc2V0IGluIHRoZSBkYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX292ZXJyaWRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfZmllbGRzOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHM7XG59XG4vKipcbiAqIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgY29kZXMgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byB0ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlIHtcbiAgICBVcGRhdGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEUnLFxuICAgIENvbXBsZXRlID0gJ0JBTktfSU5DT01FX1JFRlJFU0hfQ09NUExFVEUnXG59XG5cbi8qKlxuICogT3B0aW9uYWwgZmllbGRzIHdoaWNoIHdpbGwgYmUgcG9wdWxhdGVkIGluIHRoZSBzaW11bGF0ZWQgd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IFdlYmhvb2tUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW0ge1xuICAgIERlZmF1bHRVcGRhdGUgPSAnREVGQVVMVF9VUERBVEUnLFxuICAgIE5ld0FjY291bnRzQXZhaWxhYmxlID0gJ05FV19BQ0NPVU5UU19BVkFJTEFCTEUnLFxuICAgIEF1dGhEYXRhVXBkYXRlID0gJ0FVVEhfREFUQV9VUERBVEUnLFxuICAgIEF1dGhvcml6YXRpb25HcmFudGVkID0gJ0FVVEhPUklaQVRJT05fR1JBTlRFRCcsXG4gICAgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlID0gJ1JFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFJyxcbiAgICBTeW5jVXBkYXRlc0F2YWlsYWJsZSA9ICdTWU5DX1VQREFURVNfQVZBSUxBQkxFJyxcbiAgICBQcm9kdWN0UmVhZHkgPSAnUFJPRFVDVF9SRUFEWScsXG4gICAgRXJyb3IgPSAnRVJST1InXG59XG5cbi8qKlxuICogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIGlzIGB0cnVlYCAgaWYgdGhlIHRlc3RgIHdlYmhvb2tfY29kZWAgIHdhcyBzdWNjZXNzZnVsbHkgZmlyZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2tfZmlyZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB3aG9zZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHRvIGJlIG1vZGlmaWVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIHRvIHNldCB0aGUgYWNjb3VudCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHNhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgb2F1dGhfc3RhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0aGUgSXRlbSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHByb2Nlc3NvciB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIGAvcHJvY2Vzc29yL2AgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgSW5jb21lIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2Ygb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29uZmlndXJpbmcgdGhlIEl0ZW0uIElmIHNwZWNpZmllZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSB3ZWJob29rIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBuZXcgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGVzdCB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGB1c2VyX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfdXNlcm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlc3QgcGFzc3dvcmQgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgcGFzc19nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3Bhc3N3b3JkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb24/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbjtcbn1cbi8qKlxuICogQSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBvcHRpb25zLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYGluaXRpYWxfcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYmFua19pbmNvbWU/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZTtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbnMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIElmIHByb3ZpZGVkLCBvbmx5IHRoZSBwZW5kaW5nIGJhbGFuY2UgdGhhdCBpcyBkdWUgYmVmb3JlIHRoZSBgdmlydHVhbF90aW1lc3RhbXBgIG9uIHRoZSB0ZXN0IGNsb2NrIHdpbGwgYmUgY29udmVydGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBldmVudCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIGB0ZXN0X2Nsb2NrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcmVmdW5kLnBvc3RlZGAsIGByZWZ1bmQuc2V0dGxlZGAsIGByZWZ1bmQuZmFpbGVkYCwgb3IgYHJlZnVuZC5yZXR1cm5lZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHJlZnVuZCBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcmVmdW5kLnBlbmRpbmdgIC0tPiBgcmVmdW5kLmZhaWxlZGAgIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQucG9zdGVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnJldHVybmVkYCAgYHJlZnVuZC5wb3N0ZWRgIC0tPiBgcmVmdW5kLnNldHRsZWRgICBgcmVmdW5kLnBvc3RlZGAgZXZlbnRzIGNhbiBvbmx5IGJlIHNpbXVsYXRlZCBpZiB0aGUgcmVmdW5kZWQgdHJhbnNmZXIgaGFzIGJlZW4gdHJhbnNpdGlvbmVkIHRvIHNldHRsZWQuIFRoaXMgbWltaWNzIHRoZSBvcmRlcmluZyBvZiBldmVudHMgaW4gUHJvZHVjdGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldHVybmVkYCAgYHBvc3RlZGAgLS0+IGBzZXR0bGVkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIHN3ZWVwIHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIG9uIHRoZSBkYXkgb2YgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBgdGVzdF9jbG9ja2AuIElmIHRoZSBkYXRlIG9mIGB2aXJ0dWFsX3RpbWVgIGlzIG9uIHdlZWtlbmQgb3IgYSBmZWRlcmFsIGhvbGlkYXksIHRoZSBuZXh0IGF2YWlsYWJsZSBiYW5raW5nIGRheSBpcyB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcD86IFNpbXVsYXRlZFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmlydHVhbCB0aW1lc3RhbXAgb24gdGhlIHRlc3QgY2xvY2suIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdGltZXN0YW1wIHdpbGwgYmUgdXNlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHZpcnR1YWxfdGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUZXN0Q2xvY2t9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGVzdF9jbG9jazogVHJhbnNmZXJUZXN0Q2xvY2s7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclRlc3RDbG9ja31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrOiBUcmFuc2ZlclRlc3RDbG9jaztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrczogQXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxBY2NvdW50QWNjZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gbmV3bHkgb3BlbmVkIGFjY291bnRzIGFzIHRoZXkgYXJlIG9wZW5lZC4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIGluZGljYXRvciBmb3Igd2hlbiBzY29wZXMgYXJlIGJlaW5nIHVwZGF0ZWQuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIHZpYSBlbnJvbGxtZW50IChpLmUuIE9BdXRoKSwgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBFTlJPTExNRU5UYC4gV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgaW4gYSBwb3N0LWVucm9sbG1lbnQgdmlldywgdGhlIHBhcnRuZXIgbXVzdCBzZW5kIGBQT1JUQUxgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2NvcGVzQ29udGV4dCB7XG4gICAgRW5yb2xsbWVudCA9ICdFTlJPTExNRU5UJyxcbiAgICBQb3J0YWwgPSAnUE9SVEFMJ1xufVxuXG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTY29wZXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXNpcyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoeSBhIHNjcmVlbmluZyBoaXQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgdXNlciBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWVzPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCB0aGF0IHdlcmUgY29tcGFyZWQgd2hlbiB0aGUgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIHNjcmVlbmluZyBoaXRzIGFyZSBpbW11dGFibGUgb25jZSB0aGV5IGhhdmUgYmVlbiByZXZpZXdlZC4gSWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgZHVlIHRvIHVwZGF0ZXMgdG8gdGhlIHNjcmVlbmluZ1xcJ3MgYHNlYXJjaF90ZXJtc2AsIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBzY3JlZW5pbmcgaGl0IHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXNfdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIERhdGVzIG9mIGJpcnRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZGF0ZXNfb2ZfYmlydGg/OiBBcnJheTxTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIExvY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHdhdGNobGlzdCBoaXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogQXJyYXk8R2VuZXJpY1NjcmVlbmluZ0hpdExvY2F0aW9uSXRlbXM+O1xuICAgIC8qKlxuICAgICAqIE5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0YVxuICAgICAqL1xuICAgIG5hbWVzPzogQXJyYXk8U2NyZWVuaW5nSGl0TmFtZXNJdGVtcz47XG59XG4vKipcbiAqIEFuYWx5emVkIGRhdGUgb2YgYmlydGggZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRlT2ZCaXJ0aEl0ZW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRlUmFuZ2V9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICAgICAqL1xuICAgIGRhdGE/OiBEYXRlUmFuZ2U7XG59XG4vKipcbiAqIEFuYWx5emVkIGRvY3VtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50O1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBpbmRpdmlkdWFsIHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgU0NSRUVOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHNjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIHNlY3VyaXR5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBUaGUgYHNlY3VyaXR5X2lkYCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzaW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjdXNpcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlZG9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZ2l2ZW4gdG8gdGhlIHNlY3VyaXR5IGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkYCBpcyBwcmVzZW50LCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgUGxhaWQgYGluc3RpdHV0aW9uX2lkYCBvZiB0aGUgaW5zdGl0dXRpb24gdG8gd2hvbSB0aGUgaWRlbnRpZmllciBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW4gY2VydGFpbiBjYXNlcywgUGxhaWQgd2lsbCBwcm92aWRlIHRoZSBJRCBvZiBhbm90aGVyIHNlY3VyaXR5IHdob3NlIHBlcmZvcm1hbmNlIHJlc2VtYmxlcyB0aGlzIHNlY3VyaXR5LCB0eXBpY2FsbHkgd2hlbiB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgaGFzIGxvdyB2b2x1bWUsIG9yIHdoZW4gYSBwcml2YXRlIHNlY3VyaXR5IGNhbiBiZSBtb2RlbGVkIHdpdGggYSBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBwcm94eV9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgc2VjdXJpdHkgaXMgYSBoaWdobHkgbGlxdWlkIGFzc2V0IGFuZCBjYW4gYmUgdHJlYXRlZCBsaWtlIGNhc2guXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNfY2FzaF9lcXVpdmFsZW50OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHkgdHlwZSBvZiB0aGUgaG9sZGluZy4gVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3B0aW9uQ29udHJhY3R9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgb3B0aW9uX2NvbnRyYWN0OiBPcHRpb25Db250cmFjdCB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogMTItY2hhcmFjdGVyIElTSU4sIGEgZ2xvYmFsbHkgdW5pcXVlIHNlY3VyaXRpZXMgaWRlbnRpZmllci4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzaW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogOS1jaGFyYWN0ZXIgQ1VTSVAsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gTm9ydGggQW1lcmljYW4gc2VjdXJpdGllcy4gQSB2ZXJpZmllZCBDVVNJUCBHbG9iYWwgU2VydmljZXMgbGljZW5zZSBpcyByZXF1aXJlZCB0byByZWNlaXZlIHRoaXMgZGF0YS4gVGhpcyBmaWVsZCB3aWxsIGJlIG51bGwgYnkgZGVmYXVsdCBmb3IgbmV3IGN1c3RvbWVycywgYW5kIG51bGwgZm9yIGV4aXN0aW5nIGN1c3RvbWVycyBzdGFydGluZyBNYXJjaCAxMiwgMjAyNC4gSWYgeW91IHdvdWxkIGxpa2UgYWNjZXNzIHRvIHRoaXMgZmllbGQsIHBsZWFzZSBzdGFydCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIHNlbGZpZSBhbmQgdGhlIGRvY3VtZW50IChpZiBkb2N1bWVudGFyeSB2ZXJpZmljYXRpb24gYWxzbyByYW4pLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb24ge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0lucHV0ID0gJ25vX2lucHV0J1xufVxuXG4vKipcbiAqIFRoZSBpbWFnZSBvciB2aWRlbyBjYXB0dXJlIG9mIGEgc2VsZmllLiBPbmx5IG9uZSBvZiBpbWFnZSBvciB2aWRlbyBVUkwgd2lsbCBiZSBwb3B1bGF0ZWQgcGVyIHNlbGZpZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgZm9yIGRvd25sb2FkaW5nIGFuIGltYWdlIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICBpbWFnZV91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYSB2aWRlbyBzZWxmaWUgY2FwdHVyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDYXB0dXJlXG4gICAgICovXG4gICAgdmlkZW9fdXJsOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLnNlbGZpZV9jaGVja2AgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDaGVja1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2tTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVDaGVja1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBzZWxmaWVzIHN1Ym1pdHRlZCB0byB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC4gRWFjaCBlbnRyeSByZXByZXNlbnRzIG9uZSB1c2VyIHN1Ym1pc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PFNlbGZpZUNoZWNrU2VsZmllPn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzZWxmaWVzOiBBcnJheTxTZWxmaWVDaGVja1NlbGZpZT47XG59XG4vKipcbiAqIENhcHR1cmVzIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3Mgc2VsZmllLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDaGVja1NlbGZpZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIHN0YXR1czogU2VsZmllU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXR0ZW1wdGAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCBzZWxmaWUgdXBsb2FkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDYXB0dXJlfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGNhcHR1cmU6IFNlbGZpZUNhcHR1cmU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1NlbGZpZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBTZWxmaWVBbmFseXNpcztcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYHNlbGZpZV9jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5zZWxmaWVfY2hlY2tgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQ2hlY2tTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvdXRjb21lIHN0YXR1cyBmb3IgdGhpcyBzcGVjaWZpYyBzZWxmaWUuIERpc3RpbmN0IGZyb20gdGhlIG92ZXJhbGwgYHNlbGZpZV9jaGVjay5zdGF0dXNgIHRoYXQgc3VtbWFyaXplcyB0aGUgdmVyaWZpY2F0aW9uIG91dGNvbWUgZnJvbSBvbmUgb3IgbW9yZSBzZWxmaWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllU3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VuZGVyQkFDU051bGxhYmxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IGRlY2lzaW9uIGZyb20gdGhlIHJpc2sgYXNzZXNzbWVudC4gIGBBUFBST1ZFYDogYXBwcm92ZSB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZXF1aXJpbmcgZnVydGhlciBhY3Rpb25zIGZyb20geW91ciBjdXN0b21lcnMuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgYXJlIHBsYWNpbmcgYSBzdGFuZGFyZCBob2xkIGZvciBhbGwgdGhlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gWW91IHNob3VsZCBhbHNvIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBkZWNpZGUgdG8gYWNjZWxlcmF0ZSB0aGUgZnVuZCBhdmFpbGFiaWxpdHkgZm9yIHlvdXIgY3VzdG9tZXJzLiAgYFJFVklFV2A6IHRoZSB0cmFuc2FjdGlvbiByZXF1aXJlcyBtYW51YWwgcmV2aWV3ICBgUkVKRUNUYDogcmVqZWN0IHRoZSB0cmFuc2FjdGlvbiAgYFRBS0VfT1RIRVJfUklTS19NRUFTVVJFU2A6IGZvciBleGFtcGxlLCBwbGFjaW5nIGEgbG9uZ2VyIGhvbGQgb24gZnVuZHMgdGhhbiB0aG9zZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgb3IgaW50cm9kdWNpbmcgY3VzdG9tZXIgZnJpY3Rpb25zIHN1Y2ggYXMgc3RlcC11cCB2ZXJpZmljYXRpb24vYXV0aGVudGljYXRpb24gIGBOT1RfRVZBTFVBVEVEYDogaWYgb25seSBsb2dnaW5nIHRoZSBTaWduYWwgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gIFBvc3NpYmxlIHZhbHVlczogIGBBUFBST1ZFYCwgYFJFVklFV2AsIGBSRUpFQ1RgLCBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYCwgYE5PVF9FVkFMVUFURURgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGRldmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiBcXFwiTW96aWxsYS81LjBcXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgY29yZSBhdHRyaWJ1dGVzIG9iamVjdCBjb250YWlucyBhZGRpdGlvbmFsIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgdGhlIEFDSCByZXR1cm4gcmlzay4gRXhhbXBsZXMgb2YgZGF0YSBpbmNsdWRlOiAgYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIGBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50YDogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50ICBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBTYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgd2l0aGluIHRoZSBwYXN0IDkwIGRheXMgd2hlbiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBoYWQgYSBuZWdhdGl2ZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZhaWxhYmxlIGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3VycmVudF9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGJhbGFuY2VfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHRoYXQgaXMgdGhlIGZ1bmRpbmcgc291cmNlIGZvciB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24uIFRoZSBgYWNjb3VudF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBhcyB3ZWxsIGFzIHRoZSBbYG9uU3VjY2Vzc2BdKC9kb2NzL2xpbmsvaW9zLyNsaW5rLWlvcy1vbnN1Y2Nlc3MtbGlua1N1Y2Nlc3MtbWV0YWRhdGEtYWNjb3VudHMtaWQpIGNhbGxiYWNrIG1ldGFkYXRhLiAgVGhpcyB3aWxsIHJldHVybiBhbiBbYElOVkFMSURfQUNDT1VOVF9JRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLWlucHV0LyNpbnZhbGlkX2FjY291bnRfaWQpIGVycm9yIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIHJlbW92ZWQgYXQgdGhlIGJhbmsgb3IgaWYgdGhlIGBhY2NvdW50X2lkYCBpcyBubyBsb25nZXIgdmFsaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGlzIGEgcmVjdXJyaW5nIHRyYW5zYWN0aW9uOyBgZmFsc2VgIG90aGVyd2lzZSBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfcmVjdXJyaW5nPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgQUNIIG9yIG5vbi1BQ0ggcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyBgU1RBTkRBUkRfQUNIYDogc3RhbmRhcmQgQUNIIGJ5IE5BQ0hBIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgOiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IGRlYml0IHJhaWwgb3IgdGhlcmUgYXJlIG11bHRpcGxlIHBheW1lbnQgbWV0aG9kcyBQb3NzaWJsZSB2YWx1ZXM6ICBgU0FNRV9EQVlfQUNIYCwgYE5FWFRfREFZX0FDSGAsIGBTVEFOREFSRF9BQ0hgLCBgUkVBTF9USU1FX1BBWU1FTlRTYCwgYERFQklUX0NBUkRgLCBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyPzogU2lnbmFsVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJpc2sgcHJvZmlsZSB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIEEgcmlzayBwcm9maWxlIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIHZpYSB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBub3QgcHJvdmlkZWQsIG5vIHJpc2sgcHJvZmlsZSB3aWxsIGJlIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgaW4gY2xvc2VkIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJpc2tfcHJvZmlsZV9rZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvaW5jb21lL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29yZV9hdHRyaWJ1dGVzPzogU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza1Byb2ZpbGV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByaXNrX3Byb2ZpbGU/OiBSaXNrUHJvZmlsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgcGF5bWVudCBtZXRob2QgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIHRoZSByaXNrIGFzc2Vzc21lbnQuIEl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBwYXltZW50IG1ldGhvZC4gIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTkFDSEEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5ICBgTkVYVF9EQVlfQUNIYDogTmV4dCBEYXkgQUNIIHNldHRsZW1lbnQgZm9yIGRlYml0IHRyYW5zYWN0aW9ucywgb2ZmZXJlZCBieSBzb21lIHBheW1lbnQgcHJvY2Vzc29ycyAgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSAgYFJFQUxfVElNRV9QQVlNRU5UU2A6IHJlYWwtdGltZSBwYXltZW50cyBzdWNoIGFzIFJUUCBhbmQgRmVkTm93ICBgREVCSVRfQ0FSRGA6IGlmIHRoZSBkZWZhdWx0IHBheW1lbnQgaXMgb3ZlciBkZWJpdCBjYXJkIG5ldHdvcmtzICBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgIFBvc3NpYmxlIHZhbHVlczogYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2AgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTaWduYWxQYXltZW50TWV0aG9kIHtcbiAgICBTYW1lRGF5QWNoID0gJ1NBTUVfREFZX0FDSCcsXG4gICAgTmV4dERheUFjaCA9ICdORVhUX0RBWV9BQ0gnLFxuICAgIFN0YW5kYXJkQWNoID0gJ1NUQU5EQVJEX0FDSCcsXG4gICAgUmVhbFRpbWVQYXltZW50cyA9ICdSRUFMX1RJTUVfUEFZTUVOVFMnLFxuICAgIERlYml0Q2FyZCA9ICdERUJJVF9DQVJEJyxcbiAgICBNdWx0aXBsZVBheW1lbnRNZXRob2RzID0gJ01VTFRJUExFX1BBWU1FTlRfTUVUSE9EUydcbn1cblxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQZXJzb25OYW1lXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQZXJzb25OYW1lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbmFtZSBwcmVmaXggKGUuZy4gXFxcIk1yLlxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHByZWZpeD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGdpdmVuIG5hbWUuIElmIHRoZSB1c2VyIGhhcyBhIG9uZS13b3JkIG5hbWUsIGl0IHNob3VsZCBiZSBwcm92aWRlZCBpbiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmYW1pbHkgbmFtZSAvIHN1cm5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHN1ZmZpeCAoZS5nLiBcXFwiSUlcXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBzdWZmaXg/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxQcmVwYXJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5fY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmV0dXJucyBmcm9tIHlvdXIgcGF5bWVudCBwcm9jZXNzb3JzLCBpbiBJU08gODYwMSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5lZF9hdD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSaXNrIHNjb3JpbmcgZGV0YWlscyBicm9rZW4gZG93biBieSByaXNrIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY29yZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjb3JlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQmFua0luaXRpYXRlZFJldHVyblJpc2s7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIChpLmUuLCB0aGUgYWNjb3VudCBob2xkZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxVc2VyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaWduYWxVc2VyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBTaWduYWxQZXJzb25OYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBDb252ZXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBtaXNzaW5nIG9yIHN0YWxlIGJhbmsgZGF0YSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgL3NpZ25hbC9ldmFsdWF0ZSBzY29yZXMgYW5kIHJlc3BvbnNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmdcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSBTaWduYWwgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2FybmluZyB0eXBlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN3ZWVwIHJldHVybmVkIGZyb20gdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQuIENhbiBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyB0cmFuc2ZlcnMgdG8gaW5jbHVkZSBpbiBhIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2lnbmVkIGRlY2ltYWwgYW1vdW50IG9mIHRoZSBzd2VlcCBhcyBpdCBhcHBlYXJzIG9uIHlvdXIgc3dlZXAgYWNjb3VudCBsZWRnZXIgKGUuZy4gXFxcIi0xMC4wMFxcXCIpICBJZiBhbW91bnQgaXMgbm90IHByZXNlbnQsIHRoZSBzd2VlcCB3YXMgbmV0LXNldHRsZWQgdG8gemVybyBhbmQgb3V0c3RhbmRpbmcgZGViaXRzIGFuZCBjcmVkaXRzIGJldHdlZW4gdGhlIHN3ZWVwIGFjY291bnQgYW5kIFBsYWlkIGFyZSBiYWxhbmNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzd2VlcCBzZXR0bGVkLCBpbiB0aGUgWVlZWS1NTS1ERCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHNldHRsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc3RhdHVzPzogU3dlZXBTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEN1cnJlbnRseSwgdGhlIGZpZWxkIHdpbGwgcmVtYWluIG51bGwgZm9yIHRyYW5zZmVycyBvbiBvdGhlciByYWlscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGFsbCByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZTogUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeTogRG9jdW1lbnRSaXNrU3VtbWFyeTtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hldGhlciBhIGRhc2hib2FyZCB1c2VyLCBhbiBBUEktYmFzZWQgdXNlciwgb3IgUGxhaWQgbGFzdCB0b3VjaGVkIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBMaW5rID0gJ2xpbmsnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVBY2NvdW50VHlwZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGRlcG9zaXRvcnlgIGFjY291bnRzIGFyZTogQXV0aCAoYGNoZWNraW5nYCBhbmQgYHNhdmluZ3NgIHR5cGVzIG9ubHkpLCBCYWxhbmNlLCBUcmFuc2FjdGlvbnMsIElkZW50aXR5LCBQYXltZW50IEluaXRpYXRpb24sIEFzc2V0cywgYW5kIEludmVzdG1lbnRzIChgY2FzaCBtYW5hZ2VtZW50YCB0eXBlIG9ubHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNyZWRpdCBjYXJkIHR5cGUgYWNjb3VudC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgY3JlZGl0YCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIFRyYW5zYWN0aW9ucywgSWRlbnRpdHksIGFuZCBMaWFiaWxpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBjcmVkaXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxvYW4gdHlwZSBhY2NvdW50LiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBsb2FuYCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIExpYWJpbGl0aWVzLCBhbmQgVHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGxvYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpbnZlc3RtZW50IGFjY291bnQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGludmVzdG1lbnRgIGFjY291bnRzIGFyZTogQmFsYW5jZSBhbmQgSW52ZXN0bWVudHMuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIHR5cGUgaXMgY2FsbGVkIGBicm9rZXJhZ2VgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGludmVzdG1lbnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdGhlciBvciB1bmtub3duIGFjY291bnQgdHlwZS4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgb3RoZXJgIGFjY291bnRzIGFyZTogQmFsYW5jZSwgVHJhbnNhY3Rpb25zLCBJZGVudGl0eSwgYW5kIEFzc2V0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGN1cnJlbmN5IGNvZGVzIGFyZSBzdXBwb3J0ZWQgYnkgUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHN1cHBvcnRzIGFsbCBJU08gNDIxNyBjdXJyZW5jeSBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgdmFsdWVzIGZvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcy4gTm90ZSB0aGF0IHRyYW5zYWN0aW9ucyByZXByZXNlbnRpbmcgaW5mbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgbmVnYXRpdmUgYW1vdW50cywgb3V0ZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIHBvc2l0aXZlIGFtb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEJ1eWluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBidXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZWxsaW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHNlbGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhbmNlbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYXNoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRmVlcyBvbiB0aGUgYWNjb3VudCwgZS5nLiBjb21taXNzaW9uLCBib29ra2VlcGluZywgb3B0aW9ucy1yZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgZmVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzQWNjb3VudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbWFzazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9vZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YnR5cGUgb2YgdGhlIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIHN0YXRlbWVudHNcXCcgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgc3RhdGVtZW50czogQXJyYXk8U3RhdGVtZW50c1N0YXRlbWVudD47XG59XG4vKipcbiAqIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9kb3dubG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RhdGVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogU3RhdGVtZW50c0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFN0YXRlbWVudHNBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBzdGF0ZW1lbnQgcmVmcmVzaCBleHRyYWN0aW9uICBgU1VDQ0VTU2A6IFRoZSBzdGF0ZW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCBhbmQgY2FuIGJlIGxpc3RlZCB2aWEgYC9zdGF0ZW1lbnRzL2xpc3QvYCBhbmQgZG93bmxvYWRlZCB2aWEgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkL2AuICBgRkFJTFVSRWA6IFRoZSBzdGF0ZW1lbnRzIGZhaWxlZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHJlZnJlc2hlZCBzdGF0ZW1lbnRzIGV4dHJhY3Rpb24gaXMgY29tcGxldGVkIG9yIGZhaWxlZCB0byBiZSBjb21wbGV0ZWQuIFRyaWdnZXJlZCBieSBjYWxsaW5nIGAvc3RhdGVtZW50cy9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVEVNRU5UU19SRUZSRVNIX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXN1bHQ6IFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc3RhdGVtZW50cy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIOKAnFlZWVktTU0tRETigJ0gZm9ybWF0LCBlLmcuIFxcXCIyMDIzLTA4LTMwXFxcIi4gVG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0ZW1lbnQgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGF0ZSByYW5nZSwgUGxhaWQgd2lsbCB1c2UgdGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZS4gVGhlIHN0YXRlbWVudCBwb3N0ZWQgZGF0ZSBpcyB0eXBpY2FsbHkgZWl0aGVyIHRoZSBsYXN0IGRheSBvZiB0aGUgc3RhdGVtZW50IHBlcmlvZCwgb3IgdGhlIGZvbGxvd2luZyBkYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4g4oCcWVlZWS1NTS1EROKAnSBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTW9udGggb2YgdGhlIHllYXIuIFBvc3NpYmxlIHZhbHVlczogMSB0aHJvdWdoIDEyIChKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBtb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIG9mIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgeWVhcjogbnVtYmVyO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogU2F0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3R1ZGVudExvYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2lzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgbG9hbiwgZS5nLiwgXFxcIkNvbnNvbGlkYXRpb24gTG9hbnNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gcGF5bWVudCBkdWUgZm9yIHRoZSBuZXh0IGJpbGxpbmcgY3ljbGUuIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnM6IFNvbWUgaW5zdGl0dXRpb25zIHJlcXVpcmUgYSBtaW5pbXVtIHBheW1lbnQgYWNyb3NzIGFsbCBsb2FucyBhc3NvY2lhdGVkIHdpdGggYW4gYWNjb3VudCBudW1iZXIuIE91ciBBUEkgcHJlc2VudHMgdGhhdCBzYW1lIG1pbmltdW0gcGF5bWVudCBhbW91bnQgb24gZWFjaCBsb2FuLiBUaGUgaW5zdGl0dXRpb25zIHRoYXQgZG8gdGhpcyBhcmU6IEdyZWF0IExha2VzICggYGluc18xMTY4NjFgKSwgRmlyc3RtYXJrIChgaW5zXzExNjI5NWApLCBDb21tb25ib25kIEZpcnN0bWFyayBTZXJ2aWNlcyAoYGluc18xMTY5NTBgKSwgTmVsbmV0IChgaW5zXzExNjUyOGApLCBFZEZpbmFuY2lhbCBTZXJ2aWNlcyAoYGluc18xMTYzMDRgKSwgR3Jhbml0ZSBTdGF0ZSAoYGluc18xMTYzMDhgKSwgYW5kIE9rbGFob21hIFN0dWRlbnQgTG9hbiBBdXRob3JpdHkgKGBpbnNfMTE2OTQ1YCkuIEZpcnN0bWFyayAoYGluc18xMTYyOTVgICkgYW5kIE5hdmllbnQgKGBpbnNfMTE2MjQ4YCkgd2lsbCBkaXNwbGF5IGFzICQwIGlmIHRoZXJlIGlzIGFuIGF1dG9wYXkgcHJvZ3JhbSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBBIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkIGlmIGBsb2FuX3N0YXR1cy50eXBlYCBpcyBgZGVmZXJtZW50YCwgYGluX3NjaG9vbGAsIGBjb25zb2xpZGF0ZWRgLCBgcGFpZCBpbiBmdWxsYCwgb3IgYHRyYW5zZmVycmVkYC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX3ByaW5jaXBhbF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRvbGxhciBhbW91bnQgb2YgdGhlIGFjY3J1ZWQgaW50ZXJlc3QgYmFsYW5jZS4gRm9yIFNhbGxpZSBNYWUgKCBgaW5zXzExNjk0NGApLCB0aGlzIGFtb3VudCBpcyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBsb2FuLCBzbyB0aGlzIGZpZWxkIHdpbGwgcmV0dXJuIGFzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX2ludGVyZXN0X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZXZhbnQgYWNjb3VudCBudW1iZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBsb2FuIGZvciBwYXltZW50cy4gSW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzLCBgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyYCB3aWxsIG1hdGNoIGBhY2NvdW50X251bWJlcixgIGJ1dCBpbiBzb21lIGluc3RpdHV0aW9ucywgc3VjaCBhcyBHcmVhdCBMYWtlcyAoYGluc18xMTY4NjFgKSwgaXQgd2lsbCBiZSBkaWZmZXJlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBwYXltZW50X3JlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRSZXBheW1lbnRQbGFuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEludGVyZXN0T25seSA9ICdpbnRlcmVzdC1vbmx5JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGF5QXNZb3VFYXJuID0gJ3BheSBhcyB5b3UgZWFybicsXG4gICAgUmV2aXNlZFBheUFzWW91RWFybiA9ICdyZXZpc2VkIHBheSBhcyB5b3UgZWFybicsXG4gICAgU3RhbmRhcmQgPSAnc3RhbmRhcmQnLFxuICAgIFNhdmluZ09uQVZhbHVhYmxlRWR1Y2F0aW9uID0gJ3NhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvbicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzd2VlcCB0cmFuc2ZlciAgYFxcXCJwZW5kaW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3VycmVudGx5IHBlbmRpbmcgYFxcXCJwb3N0ZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgYmVlbiBwb3N0ZWQgYFxcXCJzZXR0bGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIHNldHRsZWQgYFxcXCJyZXR1cm5lZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBiZWVuIHJldHVybmVkIGBcXFwiZmFpbGVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGZhaWxlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSB0cmlnZ2VyIG9mIHRoZSBzd2VlcCAgYFxcXCJtYW51YWxcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBjdXN0b21lciBgXFxcImluY29taW5nXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSBpbmNvbWluZyBmdW5kcyBmbG93IChlLmcuIEluY29taW5nIFdpcmUpIGBcXFwiYmFsYW5jZV90aHJlc2hvbGRcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGJhbGFuY2UgdGhyZXNob2xkIHNldHRpbmcgYFxcXCJhdXRvbWF0aWNfYWdncmVnYXRlXFxcImAgLSBUaGUgc3dlZXAgaXMgY3JlYXRlZCBieSB0aGUgUGxhaWQgYXV0b21hdGljIGFnZ3JlZ2F0aW9uIHByb2Nlc3MuIFRoZXNlIGZ1bmRzIGRpZCBub3QgcGFzcyB0aHJvdWdoIHRoZSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFN3ZWVwVHJpZ2dlciB7XG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gICAgSW5jb21pbmcgPSAnaW5jb21pbmcnLFxuICAgIEJhbGFuY2VUaHJlc2hvbGQgPSAnYmFsYW5jZV90aHJlc2hvbGQnLFxuICAgIEF1dG9tYXRpY0FnZ3JlZ2F0ZSA9ICdhdXRvbWF0aWNfYWdncmVnYXRlJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIGNoYW5nZS4gVGhpcyBjYW4gYmUgZHVlIHRvIGFueSBldmVudCByZXN1bHRpbmcgaW4gbmV3IGNoYW5nZXMsIHN1Y2ggYXMgYW4gaW5pdGlhbCAzMC1kYXkgdHJhbnNhY3Rpb25zIGZldGNoIHVwb24gdGhlIGluaXRpYWxpemF0aW9uIG9mIGFuIEl0ZW0gd2l0aCB0cmFuc2FjdGlvbnMsIHRoZSBiYWNrZmlsbCBvZiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyB0aGF0IG9jY3VycyBzaG9ydGx5IGFmdGVyLCBvciB3aGVuIGNoYW5nZXMgYXJlIHBvcHVsYXRlZCBmcm9tIGEgcmVndWxhcmx5LXNjaGVkdWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGpvYi4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgd2hlbiB1c2luZyB0aGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHRoZSBvbGRlciB3ZWJob29rcyBgSU5JVElBTF9VUERBVEVgLCBgSElTVE9SSUNBTF9VUERBVEVgLCBgREVGQVVMVF9VUERBVEVgLCBhbmQgYFRSQU5TQUNUSU9OU19SRU1PVkVEYCwgd2hpY2ggYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3RyYW5zYWN0aW9ucy9nZXRgLCB3aWxsIGFsc28gY29udGludWUgdG8gYmUgc2VudCBpbiBvcmRlciB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRob3NlIHdlYmhvb2tzIHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBhbiBJdGVtLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBvbiB0aGF0IEl0ZW0uIFRoaXMgbWVhbnMgdGhhdCwgdW5saWtlIHRoZSBgSU5JVElBTF9VUERBVEVgIGFuZCBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2tzLCBpdCB3aWxsIG5vdCBmaXJlIGltbWVkaWF0ZWx5IHVwb24gSXRlbSBjcmVhdGlvbi4gSWYgYC90cmFuc2FjdGlvbnMvc3luY2AgaXMgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCB3YXMgKm5vdCogaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMsIHRoZSB3ZWJob29rIHdpbGwgZmlyZSB0d2ljZTogb25jZSB0aGUgZmlyc3QgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLCBhbmQgYSBzZWNvbmQgdGltZSB3aGVuIGFsbCBhdmFpbGFibGUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLiAgVGhpcyB3ZWJob29rIHdpbGwgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCBhcyBpdCB3b3VsZCBpbiBQcm9kdWN0aW9uLiBJdCBjYW4gYWxzbyBiZSBtYW51YWxseSB0cmlnZ2VyZWQgaW4gU2FuZGJveCBieSBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gKG1vc3QgcmVjZW50IDMwIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIChtYXhpbXVtIHRyYW5zYWN0aW9uIGhpc3RvcnkgcmVxdWVzdGVkLCB1cCB0byAyIHllYXJzKSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgYW4gb2ZmaWNpYWwgZG9jdW1lbnQgdXNlZCB0byByZXBvcnQgdGhlIHVzZXJcXCdzIGluY29tZSB0byB0aGUgSVJTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhmb3JtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUYXhmb3JtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0YXggZG9jdW1lbnQuIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIHZhbHVlIGlzIGB3MmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VzJ9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICB3Mj86IFcyO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySURcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySUQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExhc3QgNCBkaWdpdHMgb2YgdW5pcXVlIG51bWJlciBvZiBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsYXN0XzRfZGlnaXRzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRheHBheWVyIGlkZW50aWZpY2F0aW9uIHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuSW5mb3JtYXRpb24gYWJvdXQgdGhlIFRheHBheWVyIGlkZW50aWZpY2F0aW9uIHZhbHVlcyBhc3NpZ25lZCB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySWRlbnRpZmllclxuICAgICAqL1xuICAgIFRheHBheWVySWRlbnRpZmllclR5cGU6IFRheHBheWVySWRlbnRpZmllclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGF4cGF5ZXIgaWRlbnRpZmllciBhcyBhc3NpZ25lZCBieSB0aGUgSVJTIHRvIHRoZSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJWYWx1ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSB2YWx1ZSBmcm9tIGEgTUlTTU8gcHJlc2NyaWJlZCBsaXN0IHRoYXQgY2xhc3NpZmllcyBpZGVudGlmaWNhdGlvbiBudW1iZXJzIHVzZWQgYnkgdGhlIEludGVybmFsIFJldmVudWUgU2VydmljZSAoSVJTKSBpbiB0aGUgYWRtaW5pc3RyYXRpb24gb2YgdGF4IGxhd3MuIEEgU29jaWFsIFNlY3VyaXR5IG51bWJlciAoU1NOKSBpcyBpc3N1ZWQgYnkgdGhlIFNTQTsgYWxsIG90aGVyIHRheHBheWVyIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgYXJlIGlzc3VlZCBieSB0aGUgSVJTLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVGF4cGF5ZXJJZGVudGlmaWVyVHlwZSB7XG4gICAgSW5kaXZpZHVhbFRheHBheWVySWRlbnRpZmljYXRpb25OdW1iZXIgPSAnSW5kaXZpZHVhbFRheHBheWVySWRlbnRpZmljYXRpb25OdW1iZXInLFxuICAgIFNvY2lhbFNlY3VyaXR5TnVtYmVyID0gJ1NvY2lhbFNlY3VyaXR5TnVtYmVyJ1xufVxuXG4vKipcbiAqIFRoZSBjb2xsZWN0aW9uIG9mIFRBWFBBWUVSX0lERU5USUZJQ0FUSU9OIGVsZW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySWRlbnRpZmllcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJzXG4gICAgICovXG4gICAgVEFYUEFZRVJfSURFTlRJRklFUjogVGF4cGF5ZXJJZGVudGlmaWVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYSBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb259XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uPzogVG90YWxDYW5vbmljYWxEZXNjcmlwdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGV4dCBvZiB0aGUgbGluZSBpdGVtIGFzIHByaW50ZWQgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgRW1wbG95ZWVNZWRpY2FyZSA9ICdFTVBMT1lFRSBNRURJQ0FSRScsXG4gICAgRmljYSA9ICdGSUNBJyxcbiAgICBTb2NpYWxTZWN1cml0eUVtcGxveWVlVGF4ID0gJ1NPQ0lBTCBTRUNVUklUWSBFTVBMT1lFRSBUQVgnLFxuICAgIE1lZGljYWwgPSAnTUVESUNBTCcsXG4gICAgVmlzaW9uID0gJ1ZJU0lPTicsXG4gICAgRGVudGFsID0gJ0RFTlRBTCcsXG4gICAgTmV0UGF5ID0gJ05FVCBQQVknLFxuICAgIFRheGVzID0gJ1RBWEVTJyxcbiAgICBOb3RGb3VuZCA9ICdOT1RfRk9VTkQnLFxuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS4gVG8gcmVjZWl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSB0aGF0IGEgcG9zdGVkIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvY2F0aW9uOiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIGlzIGluIGJldGEgYW5kIHdpbGwgYmUgb21pdHRlZCB1bmxlc3MgdGhlIGNsaWVudCBpcyBib3RoIGVucm9sbGVkIGluIHRoZSBjbG9zZWQgYmV0YSBwcm9ncmFtIGFuZCBoYXMgc2V0IGBvcHRpb25zLmluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb25gIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhOiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGxvZ29fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGV0aW1lYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGV0aW1lYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGV0aW1lYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBGb3IgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgcmF0aGVyIHRoYW4gcG9zdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCBmaWVsZC4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIEFQSSB2ZXJzaW9uIDIwMTktMDUtMjkgYW5kIGxhdGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uUGF5bWVudENoYW5uZWxFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY29kZTogVHJhbnNhY3Rpb25Db2RlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQWxsT2ZcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkLiBGb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGBkYXRlYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGVgLCB3aGVuIGF2YWlsYWJsZSwgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlIG92ZXIgdGhlIGBkYXRlYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGV0aW1lYCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBwb3N0ZWQgZGF0ZSwgYnV0IGBhdXRob3JpemVkX2RhdGV0aW1lYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGV0aW1lYCBmaWVsZCBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgYXMgaXQgd2lsbCBnZW5lcmFsbHkgcmVwcmVzZW50IHRoZSBkYXRlIHRoZSB1c2VyIGFjdHVhbGx5IG1hZGUgdGhlIHRyYW5zYWN0aW9uLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGRhdGV0aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBUaGlzIGZpZWxkIHJlcGxhY2VzIHRoZSBgdHJhbnNhY3Rpb25fdHlwZWAgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uQWxsT2ZQYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY29kZTogVHJhbnNhY3Rpb25Db2RlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGFuIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkuIFRoZSBpY29uIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllcz86IEFycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgbWVyY2hhbnRfZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkFsbE9mUGF5bWVudENoYW5uZWxFbnVtIHtcbiAgICBPbmxpbmUgPSAnb25saW5lJyxcbiAgICBJblN0b3JlID0gJ2luIHN0b3JlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25CYXNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkJhc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgdHJhbnNhY3Rpb25zXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBUcmFuc2FjdGlvbnMgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBncmVhdGVyIGFjY3VyYWN5IGFuZCBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgaXMgaW4gYmV0YSBhbmQgd2lsbCBiZSBvbWl0dGVkIHVubGVzcyB0aGUgY2xpZW50IGlzIGJvdGggZW5yb2xsZWQgaW4gdGhlIGNsb3NlZCBiZXRhIHByb2dyYW0gYW5kIGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uQmFzZVRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgd2Vic2l0ZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bSB7XG4gICAgRGlnaXRhbCA9ICdkaWdpdGFsJyxcbiAgICBQbGFjZSA9ICdwbGFjZScsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJyxcbiAgICBVbnJlc29sdmVkID0gJ3VucmVzb2x2ZWQnXG59XG5cbi8qKlxuICogQW4gaWRlbnRpZmllciBjbGFzc2lmeWluZyB0aGUgdHJhbnNhY3Rpb24gdHlwZS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIEV1cm9wZWFuIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgYW5kIENhbmFkYSwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gYG51bGxgLiAgYGFkanVzdG1lbnQ6YCBCYW5rIGFkanVzdG1lbnQgIGBhdG06YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCB2aWEgYW4gYXV0b21hdGVkIHRlbGxlciBtYWNoaW5lICBgYmFuayBjaGFyZ2U6YCBDaGFyZ2Ugb3IgZmVlIGxldmllZCBieSB0aGUgaW5zdGl0dXRpb24gIGBiaWxsIHBheW1lbnRgOiBQYXltZW50IG9mIGEgYmlsbCAgYGNhc2g6YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCAgYGNhc2hiYWNrOmAgQ2FzaCB3aXRoZHJhd2FsIHdoaWxlIG1ha2luZyBhIGRlYml0IGNhcmQgcHVyY2hhc2UgIGBjaGVxdWU6YCBEb2N1bWVudCBvcmRlcmluZyB0aGUgcGF5bWVudCBvZiBtb25leSB0byBhbm90aGVyIHBlcnNvbiBvciBvcmdhbml6YXRpb24gIGBkaXJlY3QgZGViaXQ6YCBBdXRvbWF0aWMgd2l0aGRyYXdhbCBvZiBmdW5kcyBpbml0aWF0ZWQgYnkgYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGBpbnRlcmVzdDpgIEludGVyZXN0IGVhcm5lZCBvciBpbmN1cnJlZCAgYHB1cmNoYXNlOmAgUHVyY2hhc2UgbWFkZSB3aXRoIGEgZGViaXQgb3IgY3JlZGl0IGNhcmQgIGBzdGFuZGluZyBvcmRlcjpgIFBheW1lbnQgaW5zdHJ1Y3RlZCBieSB0aGUgYWNjb3VudCBob2xkZXIgdG8gYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGB0cmFuc2ZlcjpgIFRyYW5zZmVyIG9mIG1vbmV5IGJldHdlZW4gYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQ29kZSB7XG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBdG0gPSAnYXRtJyxcbiAgICBCYW5rQ2hhcmdlID0gJ2JhbmsgY2hhcmdlJyxcbiAgICBCaWxsUGF5bWVudCA9ICdiaWxsIHBheW1lbnQnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgQ2FzaGJhY2sgPSAnY2FzaGJhY2snLFxuICAgIENoZXF1ZSA9ICdjaGVxdWUnLFxuICAgIERpcmVjdERlYml0ID0gJ2RpcmVjdCBkZWJpdCcsXG4gICAgSW50ZXJlc3QgPSAnaW50ZXJlc3QnLFxuICAgIFB1cmNoYXNlID0gJ3B1cmNoYXNlJyxcbiAgICBTdGFuZGluZ09yZGVyID0gJ3N0YW5kaW5nIG9yZGVyJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHR5cGU6IENvdW50ZXJwYXJ0eVR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoZWQgZGlyZWN0IGRlcG9zaXQgdHJhbnNhY3Rpb24gdXNlZCB0byB2ZXJpZnkgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGFcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSB0byBwb3B1bGF0ZSBhcyB0ZXN0IHRyYW5zYWN0aW9uIGRhdGEuIElmIG5vdCBzcGVjaWZpZWQsIHJhbmRvbSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gVHJhbnNhY3Rpb25zIGluIFNhbmRib3ggd2lsbCBtb3ZlIGZyb20gcGVuZGluZyB0byBwb3N0ZWQgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBkYXRlIGhhcyBiZWVuIHJlYWNoZWQuIElmIGEgYGRhdGVfdHJhbnNhY3RlZGAgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgYSB0cmFuc2FjdGlvbiBkYXRlIG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIFtgYXV0aG9yaXplZF9kYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnMtZ2V0LXJlc3BvbnNlLXRyYW5zYWN0aW9ucy1hdXRob3JpemVkLWRhdGUpIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBQb3N0ZWQgZGF0ZXMgaW4gdGhlIHBhc3Qgb3IgcHJlc2VudCB3aWxsIHJlc3VsdCBpbiBwb3N0ZWQgdHJhbnNhY3Rpb25zOyBwb3N0ZWQgZGF0ZXMgaW4gdGhlIGZ1dHVyZSB3aWxsIHJlc3VsdCBpbiBwZW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LiBDYW4gYmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgZm9ybWF0IGN1cnJlbmN5IGNvZGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgcmVsYXRlZCB0cmFuc2FjdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBzdHJlYW0gYmVsb25nc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdHJlYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAuIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBwcm92aWRlcyBtb3JlIG1lYW5pbmdmdWwgY2F0ZWdvcml6YXRpb24gYW5kIGdyZWF0ZXIgYWNjdXJhY3kuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZpcnN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGVkIGRhdGUgb2YgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgbGFzdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeTogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbW9kaWZpZWQgYnkgcmVxdWVzdCB0byBhIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zYCBlbmRwb2ludC4gSXQgd2lsbCBiZSBgZmFsc2VgIGZvciBhbGwgb3RoZXIgc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc191c2VyX21vZGlmaWVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB1c2VyIG1vZGlmaWNhdGlvbi4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIGBpc191c2VyX21vZGlmaWVkYCBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X3VzZXJfbW9kaWZpZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIGRhdGEgcGVydGFpbmluZyB0byBhbiBhbW91bnQgb24gdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtQW1vdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIGFuIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYE1BVFVSRWA6IEEgYE1BVFVSRWAgcmVjdXJyaW5nIHN0cmVhbSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHRyYW5zYWN0aW9ucyBhbmQgaGFwcGVuIG9uIGEgcmVndWxhciBjYWRlbmNlIChGb3IgQW5udWFsIHJlY3VycmluZyBzdHJlYW0sIHdlIHdpbGwgbWFyayBpdCBgTUFUVVJFYCBhZnRlciAyIGluc3RhbmNlcykuICBgRUFSTFlfREVURUNUSU9OYDogV2hlbiBhIHJlY3VycmluZyB0cmFuc2FjdGlvbiBmaXJzdCBhcHBlYXJzIGluIHRoZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGFuZCBiZWZvcmUgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IG9mIGEgbWF0dXJlIHN0cmVhbSwgdGhlIHN0YXR1cyB3aWxsIGJlIGBFQVJMWV9ERVRFQ1RJT05gLiAgYFRPTUJTVE9ORURgOiBBIHN0cmVhbSB0aGF0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBgRUFSTFlfREVURUNUSU9OYCBzdGF0dXMgd2lsbCBtb3ZlIHRvIHRoZSBgVE9NQlNUT05FRGAgc3RhdHVzIHdoZW4gbm8gZnVydGhlciB0cmFuc2FjdGlvbnMgd2VyZSBmb3VuZCBhdCB0aGUgbmV4dCBleHBlY3RlZCBkYXRlLiAgYFVOS05PV05gOiBBIHN0cmVhbSBpcyBhc3NpZ25lZCBhbiBgVU5LTk9XTmAgc3RhdHVzIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgc3RhdHVzZXMgYXJlIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBNYXR1cmUgPSAnTUFUVVJFJyxcbiAgICBFYXJseURldGVjdGlvbiA9ICdFQVJMWV9ERVRFQ1RJT04nLFxuICAgIFRvbWJzdG9uZWQgPSAnVE9NQlNUT05FRCdcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25zIGNhdGVnb3J5IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBydWxlIGNyZWF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBJdGVtIHRoZSBydWxlIHdhcyBjcmVhdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHJ1bGUgd2FzIGNyZWF0ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdW5pcXVlIGlkZW50aWZpZXIuICBJbiB0aGUgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSB0YXhvbm9teSwgdGhpcyBmaWVsZCBpcyByZXByZXNlbnRlZCBieSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZmllbGQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1J1bGVEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBydWxlX2RldGFpbHM/OiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlscztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChgZGVwb3NpdG9yeWAgb3IgYGNyZWRpdGApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcmF3IHRyYW5zYWN0aW9ucyB0byBiZSBlbmhhbmNlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBlbmhhbmNlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuaGFuY2VkX3RyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChlaXRoZXIgYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb24gb2JqZWN0cyB0byBiZSBlbnJpY2hlZCBieSBQbGFpZC4gTWF4aW11bSBvZiAxMDAgdHJhbnNhY3Rpb25zIHBlciByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgYGxlZ2FjeV9jYXRlZ29yeWAgYW5kIGBsZWdhY3lfY2F0ZWdvcnlfaWRgIGluIHRoZSByZXNwb25zZSAoaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgKS4gIENhdGVnb3JpZXMgYXJlIGJhc2VkIG9uIFBsYWlkXFwncyBsZWdhY3kgdGF4b25vbXkuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdhY3kgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xlZ2FjeV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZW5yaWNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVucmljaGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnJpY2hlZF90cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgZmllbGQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgcGFyc2VkIGRhdGEgcHJvdmlkZWQsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIsIG9yIHN1Ym1pdCBhIFtTdXBwb3J0IHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9wcm9kdWN0LWZ1bmN0aW9uYWxpdHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9sb2dvX2FuZF9jb3VudGVycGFydHlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB0aGF0IHdlcmUgbm90IGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIGR1cmluZyBMaW5rIGFuZCBhcmUgbm93IGFkZGluZyB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgdG8gdGhlIEl0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcHRpb24gY29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0aGF0IFBsYWlkIHdpbGwgcmVxdWVzdCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBhZnRlciBEZWNlbWJlciAzLCAyMDIzLCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuIEZvciBkZXZlbG9wZXIgYWNjb3VudHMgY3JlYXRlZCBvbiBEZWNlbWJlciAzLCAyMDIzIG9yIGVhcmxpZXIsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gNzMwIGRheXMgdW50aWwgSnVuZSAyNCwgMjAyNCwgYXQgd2hpY2ggcG9pbnQgaXQgd2lsbCBkZWZhdWx0IHRvIDkwIGRheXMuICBJZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBwcmlvciB0byB0aGlzIGNhbGwsIHRoaXMgZmllbGQgd2lsbCBoYXZlIG5vIGVmZmVjdC4gIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB1dGlsaXppbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYGFjY291bnRzYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIHRyYW5zYWN0aW9ucyBhcmUgYmVpbmcgcmV0dXJuZWQuIEVhY2ggdHJhbnNhY3Rpb24gY2FuIGJlIG1hcHBlZCB0byBpdHMgY29ycmVzcG9uZGluZyBhY2NvdW50IHZpYSB0aGUgYGFjY291bnRfaWRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQgZGVmaW5lcyBhIHNpbmdsZSBpbnB1dCB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvY3JlYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvY3JlYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogU3RyZWFtcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogT3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM/OiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dCB7XG4gICAgLyoqXG4gICAgICogSURzIG9mIGFsbCB0aGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGZpcnN0IHN0cmVhbS4gVGhpcyBvcGVyYXRpb24gd2lsbCByZXRhaW4gdGhlIHN0cmVhbV9pZCBvZiB0aGUgZmlyc3Qgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0XG4gICAgICovXG4gICAgc3RyZWFtX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0IGRlZmluZWQgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGlucHV0czogQXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWRzIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHF1YWxpZmllZCBhcyByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIG9wZXJhdGlvbiB0byB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCB0aGUgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuIFRoaXMgd2lsbCBlaXRoZXIgYWxsIHN1Y2NlZWQgb3IgYWxsIGZhaWwuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlucHV0czogQXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlSW5wdXQ+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkX3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWRzIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHF1YWxpZmllZCBhcyByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZF9zdHJlYW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB0cmFuc2FjdGlvbnMgcnVsZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBwcm92aWRlIHRyYW5zYWN0aW9uX2lkLiBGb3IgTkFNRSBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBOYW1lID0gJ05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBFWEFDVF9NQVRDSCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBkZXRhaWxlZCBjYXRlZ29yeS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoaXMgZmllbGQgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLCBhcyBpdCBwcm92aWRlcyBtb3JlIG1lYW5pbmdmdWwgYW5kIGFjY3VyYXRlIGNhdGVnb3JpemF0aW9uLiAgU2VlIHRoZSBbYHRheG9ub215IGNzdiBmaWxlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzOiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlscztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGU6IFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb24gcnVsZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlczogQXJyYXk8VHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJ1bGVcXCdzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnNvciB2YWx1ZSByZXByZXNlbnRzIHRoZSBsYXN0IHVwZGF0ZSByZXF1ZXN0ZWQuIFByb3ZpZGluZyBpdCB3aWxsIGNhdXNlIHRoZSByZXNwb25zZSB0byBvbmx5IHJldHVybiBjaGFuZ2VzIGFmdGVyIHRoaXMgdXBkYXRlLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlIGhpc3Rvcnkgb2YgdXBkYXRlcyB3aWxsIGJlIHJldHVybmVkLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdC1hZGRlZCB0cmFuc2FjdGlvbnMgb24gdGhlIEl0ZW0uIFRoZSBjdXJzb3IgYWxzbyBhY2NlcHRzIHRoZSBzcGVjaWFsIHZhbHVlIG9mIGBcXFwibm93XFxcImAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZhc3QtZm9yd2FyZCB0aGUgY3Vyc29yIGFzIHBhcnQgb2YgbWlncmF0aW5nIGFuIGV4aXN0aW5nIEl0ZW0gZnJvbSBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIHN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiBOb3RlIHRoYXQgdXNpbmcgdGhlIGBcXFwibm93XFxcImAgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IHVzZSBjYXNlIG90aGVyIHRoYW4gbWlncmF0aW5nIGV4aXN0aW5nIEl0ZW1zIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIFRoZSB1cHBlci1ib3VuZCBsZW5ndGggb2YgdGhpcyBjdXJzb3IgaXMgMjU2IGNoYXJhY3RlcnMgb2YgYmFzZTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlciBvciBzdWJtaXQgYSBbU3VwcG9ydCByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcHJvZHVjdC1mdW5jdGlvbmFsaXR5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgdG8gY2FsbHMgZm9yIEl0ZW1zIHRoYXQgd2VyZSBub3QgaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgZHVyaW5nIExpbmsgYW5kIGFyZSBub3cgYWRkaW5nIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdCB0byB0aGUgSXRlbSBmb3IgdGhlIGZpcnN0IHRpbWUuIEluIHRoZXNlIGNhc2VzLCB0aGlzIG9wdGlvbiBjb250cm9scyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRoYXQgUGxhaWQgd2lsbCByZXF1ZXN0IGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIGFmdGVyIERlY2VtYmVyIDMsIDIwMjMsIGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gRm9yIGRldmVsb3BlciBhY2NvdW50cyBjcmVhdGVkIG9uIERlY2VtYmVyIDMsIDIwMjMgb3IgZWFybGllciwgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byA3MzAgZGF5cyB1bnRpbCBKdW5lIDI0LCAyMDI0LCBhdCB3aGljaCBwb2ludCBpdCB3aWxsIGRlZmF1bHQgdG8gOTAgZGF5cy4gIElmIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHByaW9yIHRvIHRoaXMgY2FsbCwgdGhpcyBmaWVsZCB3aWxsIGhhdmUgbm8gZWZmZWN0LiAgV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgY3VzdG9tZXJzIHV0aWxpemluZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgb24gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG1vZGlmaWVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IEFycmF5PFJlbW92ZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGFueSBmdXR1cmUgdXBkYXRlcyBhZnRlciB0aGUgbGF0ZXN0IHVwZGF0ZSBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlLiBUaGUgY3Vyc29yIG9idGFpbmVkIGFmdGVyIGFsbCBwYWdlcyBoYXZlIGJlZW4gcHVsbGVkIChpbmRpY2F0ZWQgYnkgYGhhc19tb3JlYCBiZWluZyBgZmFsc2VgKSB3aWxsIGJlIHZhbGlkIGZvciBhdCBsZWFzdCAxIHllYXIuIFRoaXMgY3Vyc29yIHNob3VsZCBiZSBwZXJzaXN0ZWQgZm9yIGxhdGVyIGNhbGxzLiBJZiB0cmFuc2FjdGlvbnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBpZiBtb3JlIHRoYW4gcmVxdWVzdGVkIGNvdW50IG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgZXhpc3QuIElmIHRydWUsIHRoZSBhZGRpdGlvbmFsIHVwZGF0ZXMgY2FuIGJlIGZldGNoZWQgYnkgbWFraW5nIGFuIGFkZGl0aW9uYWwgcmVxdWVzdCB3aXRoIGBjdXJzb3JgIHNldCB0byBgbmV4dF9jdXJzb3JgLiBJZiBgaGFzX21vcmVgIGlzIHRydWUsIGl04oCZcyBpbXBvcnRhbnQgdG8gcHVsbCBhbGwgYXZhaWxhYmxlIHBhZ2VzLCB0byBtYWtlIGl0IGxlc3MgbGlrZWx5IGZvciB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlcyB0byBjb25mbGljdCB3aXRoIHBhZ2luYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgY2xpZW50LXByb3ZpZGVkIHVzZXJfaWQgdG8gcmV0cmlldmUgaW5zaWdodHMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckRhdGFPdmVydmlld31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2RhdGFfb3ZlcnZpZXc6IFVzZXJEYXRhT3ZlcnZpZXc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9pbnNpZ2h0cz86IENvdW50ZXJwYXJ0eUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXRlZ29yeUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3J5X2luc2lnaHRzPzogQ2F0ZWdvcnlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2FjdGlvbnM/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbnM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBhc3NvY2lhdGVkIGZ1bmRpbmcgYWNjb3VudCwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIHByZXNlbnQsIHRoaXMgaW5kaWNhdGVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MSwgUjUyLCBSNTMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgd2hlbiB0aGUgZnVsbCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIHNldHRsZXMgYXQgdGhlIGNvbnN1bWVyc+KAmSBhY2NvdW50LCBpZiB0aGUgdHJhbnNmZXIgaXMgY3JlZGl0OyBvciBhdCB0aGUgY3VzdG9tZXJcXCdzIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnQsIGlmIHRoZSB0cmFuc2ZlciBpcyBkZWJpdC4gT25seSBzZXQgZm9yIEFDSCB0cmFuc2ZlcnMgYW5kIGlzIG51bGwgZm9yIG5vbi1BQ0ggdHJhbnNmZXJzLiBPbmx5IHNldCBmb3IgQUNIIHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIEFDSCBuZXR3b3JrcyB1c2VkIGZvciB0aGUgZnVuZHMgZmxvdy4gIEZvciByZXF1ZXN0cyBzdWJtaXR0ZWQgYXMgZWl0aGVyIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRoZSBjdXRvZmYgZm9yIHNhbWUtZGF5IGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lIGFuZCB0aGUgY3V0b2ZmIGZvciBuZXh0LWRheSB0cmFuc2ZlcnMgaXMgNTozMCBQTSBFYXN0ZXJuIFRpbWUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHN1Ym1pdCBhIHJlcXVlc3QgYXQgbGVhc3QgMTUgbWludXRlcyBiZWZvcmUgdGhlIGN1dG9mZiB0aW1lIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGUgY3V0b2ZmLiBBbnkgcmVxdWVzdCB0aGF0IGlzIGluZGljYXRlZCBhcyBgc2FtZS1kYXktYWNoYCBhbmQgdGhhdCBtaXNzZXMgdGhlIHNhbWUtZGF5IGN1dG9mZiwgYnV0IGlzIHN1Ym1pdHRlZCBpbiB0aW1lIGZvciB0aGUgbmV4dC1kYXkgY3V0b2ZmLCB3aWxsIGJlIHNlbnQgb3ZlciBuZXh0LWRheSByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQUNITmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gZm9yIGEgcHJvcG9zZWQgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgcmVwcmVzZW50aW5nIHdoZW4gdGhlIGF1dGhvcml6YXRpb24gd2FzIGNyZWF0ZWQsIGluIHRoZSBmb3JtYXQgYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrOiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHByb3Bvc2VkX3RyYW5zZmVyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmVxdWlyZWQgaWYgbm90IHVzaW5nIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgYXV0aG9yaXphdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGF1dGhvcml6YXRpb24sIHdoaWNoIGV4cGlyZXMgYWZ0ZXIgNDggaG91cnMuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYW4gYXV0aG9yaXphdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBhdXRob3JpemF0aW9uIGlzIGNyZWF0ZWQuICBUaGlzIGlkZW1wb3RlbmN5IGtleSBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLCBhZnRlciB3aGljaCB0aGUgc2FtZSBrZXkgY2FuIGJlIHJldXNlZC4gRmFpbHVyZSB0byBwcm92aWRlIHRoaXMga2V5IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgaXMgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgUGxhaWQgd2lsbCBub3Qgb2ZmZXIgYSBgZ3VhcmFudGVlX2RlY2lzaW9uYCBmb3IgdGhpcyByZXF1ZXN0IChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2l0aF9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYnkgUGxhaWRcXCdzIFtiZWFjb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvZ3VhcmFudGVlLyN1c2luZy1hLWJlYWNvbikgd2hlbiBpdCBpcyBydW4gb24geW91ciB3ZWJwYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fc2Vzc2lvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgbmVlZGVkIGlmIGNyZWF0aW5nIHRyYW5zZmVycyBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZT86IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgYXV0aG9yaXphdGlvbmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogIEEgZGVjaXNpb24gcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci4gIGBhcHByb3ZlZGAg4oCTIFRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgcmVjZWl2ZWQgdGhlIGVuZCB1c2VyXFwncyBjb25zZW50IGFuZCBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgcHJvY2Vzc2luZyBieSBQbGFpZC4gVGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIGZpZWxkIGlzIHNldCBpZiBQbGFpZCB3YXMgdW5hYmxlIHRvIGZldGNoIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uLiBZb3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBmdXJ0aGVyIHJldmlldyBpcyByZWNvbW1lbmRlZCAoaS5lLiwgdXNlIExpbmsgaW4gdXBkYXRlIHRvIHJlLWF1dGhlbnRpY2F0ZSB5b3VyIHVzZXIgd2hlbiBgZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCkuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBkZWNsaW5lZGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZWNsaW5lZCA9ICdkZWNsaW5lZCdcbn1cblxuLyoqXG4gKiBUaGUgcmF0aW9uYWxlIGZvciBQbGFpZFxcJ3MgZGVjaXNpb24gcmVnYXJkaW5nIGEgcHJvcG9zZWQgdHJhbnNmZXIuIEl0IGlzIGFsd2F5cyBzZXQgZm9yIGBkZWNsaW5lZGAgZGVjaXNpb25zLCBhbmQgbWF5IG9yIG1heSBub3QgYmUgbnVsbCBmb3IgYGFwcHJvdmVkYCBkZWNpc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIGEgdHJhbnNmZXIgYXBwcm92YWwgb3IgdHJhbnNmZXIgZGVjbGluZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJhdGlvbmFsZSBmb3IgYXBwcm92aW5nIG9yIGRlY2xpbmluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBJZiB0aGUgYHJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBwYXNzZWQgdGhlIGF1dGhvcml6YXRpb24gY2hlY2suICBBbnkgbm9uLWBudWxsYCB2YWx1ZSBmb3IgYW4gYGFwcHJvdmVkYCB0cmFuc2ZlciBpbmRpY2F0ZXMgdGhhdCB0aGUgdGhlIGF1dGhvcml6YXRpb24gY2hlY2sgY291bGQgbm90IGJlIHJ1biBhbmQgdGhhdCB5b3Ugc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBhc3Nlc3NtZW50IG9uIHRoZSB0cmFuc2Zlci4gVGhlIGNvZGUgd2lsbCBpbmRpY2F0ZSB3aHkgdGhlIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4uIFBvc3NpYmxlIHZhbHVlcyBmb3IgYW4gYGFwcHJvdmVkYCB0cmFuc2ZlciBhcmU6ICBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAg4oCTIEl0ZW0gY3JlYXRlZCB2aWEgc2FtZS1kYXkgbWljcm8gZGVwb3NpdHMsIGxpbWl0ZWQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgYElURU1fTE9HSU5fUkVRVUlSRURgIOKAkyBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gSXRlbSBzdGFsZW5lc3MuIENhbiBiZSByZXNvbHZlZCBieSB1c2luZyBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBgTUlHUkFURURfQUNDT1VOVF9JVEVNYCAtIEl0ZW0gY3JlYXRlZCB2aWEgYC90cmFuc2Zlci9hY2NvdW50X21pZ3JhdGlvbmAgZW5kcG9pbnQsIGxpbWl0ZWQgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiAgYEVSUk9SYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIGFuIHVuc3BlY2lmaWVkIGVycm9yLiAgVGhlIGZvbGxvd2luZyBjb2RlcyBpbmRpY2F0ZSB0aGF0IHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9uIHdhcyBgZGVjbGluZWRgOiAgYE5TRmAg4oCTIFRyYW5zYWN0aW9uIGxpa2VseSB0byByZXN1bHQgaW4gYSByZXR1cm4gZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBSSVNLYCAtIFRyYW5zYWN0aW9uIGlzIGhpZ2gtcmlzay4gIGBUUkFOU0ZFUl9MSU1JVF9SRUFDSEVEYCAtIE9uZSBvciBzZXZlcmFsIHRyYW5zZmVyIGxpbWl0cyBhcmUgcmVhY2hlZCwgZS5nLiBtb250aGx5IHRyYW5zZmVyIGxpbWl0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlIHtcbiAgICBOc2YgPSAnTlNGJyxcbiAgICBSaXNrID0gJ1JJU0snLFxuICAgIFRyYW5zZmVyTGltaXRSZWFjaGVkID0gJ1RSQU5TRkVSX0xJTUlUX1JFQUNIRUQnLFxuICAgIE1hbnVhbGx5VmVyaWZpZWRJdGVtID0gJ01BTlVBTExZX1ZFUklGSUVEX0lURU0nLFxuICAgIEl0ZW1Mb2dpblJlcXVpcmVkID0gJ0lURU1fTE9HSU5fUkVRVUlSRUQnLFxuICAgIFBheW1lbnRQcm9maWxlTG9naW5SZXF1aXJlZCA9ICdQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRUQnLFxuICAgIEVycm9yID0gJ0VSUk9SJyxcbiAgICBNaWdyYXRlZEFjY291bnRJdGVtID0gJ01JR1JBVEVEX0FDQ09VTlRfSVRFTScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi4gVGhlc2UgZmllbGRzIGFyZSBub3QgY3VycmVudGx5IGluY29ycG9yYXRlZCBpbnRvIHRoZSByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2VcbiAgICAgKi9cbiAgICB1c2VyX2FnZW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNmZXIgaXMgZ3VhcmFudGVlZCBieSBQbGFpZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS4gVGhpcyBmaWVsZCB3aWxsIGNvbnRhaW4gZWl0aGVyIGBHVUFSQU5URUVEYCBvciBgTk9UX0dVQVJBTlRFRURgIGluZGljYXRpbmcgd2hldGhlciBQbGFpZCB3aWxsIGd1YXJhbnRlZSB0aGUgdHJhbnNmZXIuIElmIHRoZSB0cmFuc2ZlciBpcyBub3QgZ3VhcmFudGVlZCwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlIHByb3ZpZGVkIGluIHRoZSBgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZWAgZmllbGQuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gYGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGVgIGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb24ge1xuICAgIEd1YXJhbnRlZWQgPSAnR1VBUkFOVEVFRCcsXG4gICAgTm90R3VhcmFudGVlZCA9ICdOT1RfR1VBUkFOVEVFRCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSByYXRpb25hbGUgZm9yIFBsYWlkXFwncyBkZWNpc2lvbiB0byBub3QgZ3VhcmFudGVlIGEgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIHVubGVzcyBgZ3VhcmFudGVlX2RlY2lzaW9uYCBpcyBgTk9UX0dVQVJBTlRFRURgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgdHJhbnNmZXIgY2Fubm90IGJlIGd1YXJhbnRlZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByZWFzb24gUGxhaWQgZGVjbGluZWQgdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXI6ICBgUkVUVVJOX0JBTktgOiBUaGUgcmlzayBvZiBhIGJhbmstaW5pdGlhdGVkIHJldHVybiAoZm9yIGV4YW1wbGUsIGFuIFIwMS9OU0YpIGlzIHRvbyBoaWdoIHRvIGd1YXJhbnRlZSB0aGlzIHRyYW5zZmVyLiAgYFJFVFVSTl9DVVNUT01FUmA6IFRoZSByaXNrIG9mIGEgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiAoZm9yIGV4YW1wbGUsIGEgUjEwL1VuYXV0aG9yaXplZCkgaXMgdG9vIGhpZ2ggdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXIuICBgR1VBUkFOVEVFX0xJTUlUX1JFQUNIRURgOiBUaGlzIHRyYW5zZmVyIGlzIGxvdy1yaXNrLCBidXQgR3VhcmFudGVlIGhhcyBleGhhdXN0ZWQgYW4gaW50ZXJuYWwgbGltaXQgb24gdGhlIG51bWJlciBvciByYXRlIG9mIGd1YXJhbnRlZXMgdGhhdCBhcHBsaWVzIHRvIHRoaXMgdHJhbnNmZXIuICBgUklTS19FU1RJTUFURV9VTkFWQUlMQUJMRWA6IEEgcmlzayBlc3RpbWF0ZSBpcyB1bmF2YWlsYWJsZSBmb3IgdGhpcyBJdGVtLiAgYFJFUVVJUkVEX1BBUkFNX01JU1NJTkdgOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGUge1xuICAgIFJldHVybkJhbmsgPSAnUkVUVVJOX0JBTksnLFxuICAgIFJldHVybkN1c3RvbWVyID0gJ1JFVFVSTl9DVVNUT01FUicsXG4gICAgR3VhcmFudGVlTGltaXRSZWFjaGVkID0gJ0dVQVJBTlRFRV9MSU1JVF9SRUFDSEVEJyxcbiAgICBSaXNrRXN0aW1hdGVVbmF2YWlsYWJsZSA9ICdSSVNLX0VTVElNQVRFX1VOQVZBSUxBQkxFJyxcbiAgICBSZXF1aXJlZFBhcmFtTWlzc2luZyA9ICdSRVFVSVJFRF9QQVJBTV9NSVNTSU5HJ1xufVxuXG4vKipcbiAqIFRoaXMgb2JqZWN0IGluY2x1ZGVzIHRoZSBzY29yZXMgYW5kIHJpc2sgbGV2ZWwuIFRoaXMgcmVzcG9uc2UgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGVzZSBmaWVsZHMgcGxlYXNlIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC4gIFRoZSBzY29yZSBldmFsdWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZCBhbmQgY292ZXJzIHJldHVybiBjb2RlczogXFxcIlIwMVxcXCIsIFxcXCJSMDJcXFwiLCBcXFwiUjAzXFxcIiwgXFxcIlIwNFxcXCIsIFxcXCJSMDZcXFwiLCBcXFwiUjA4XFxcIiwgIFxcXCJSMDlcXFwiLCBcXFwiUjEzXFxcIiwgXFxcIlIxNlxcXCIsIFxcXCJSMTdcXFwiLCBcXFwiUjIwXFxcIiwgXFxcIlIyM1xcXCIuIFRoZXNlIHJldHVybnMgaGF2ZSBhIHR1cm5hcm91bmQgdGltZSBvZiAyIGJhbmtpbmcgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9zY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuICBUaGUgc2NvcmUgZXZhbHVhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBvZiBhbiB1bmF1dGhvcml6ZWQgZGViaXQgYW5kIGNvdmVycyByZXR1cm4gY29kZXM6IFxcXCJSMDVcXFwiLCBcXFwiUjA3XFxcIiwgXFxcIlIxMFxcXCIsIFxcXCJSMTFcXFwiLCBcXFwiUjI5XFxcIi4gVGhlc2UgcmV0dXJucyB0eXBpY2FsbHkgaGF2ZSBhIHJldHVybiB0aW1lIGZyYW1lIG9mIHVwIHRvIDYwIGNhbGVuZGFyIGRheXMuIER1cmluZyB0aGlzIHBlcmlvZCwgdGhlIGN1c3RvbWVyIG9mIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY2FuIGRpc3B1dGUgYSB0cmFuc2FjdGlvbiBhcyB1bmF1dGhvcml6ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Njb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgcmlza19sZXZlbDogVHJhbnNmZXJBdXRob3JpemF0aW9uUmlza0xldmVsIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBiYW5rIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gdGhlIFNpZ25hbCBtb2RlbCwgdGhpcyBhcnJheSBjb250YWlucyB3YXJuaW5ncyBkZXNjcmliaW5nIHdoeSBiYW5rIGRhdGEgaXMgbWlzc2luZy4gSWYgeW91IHdhbnQgdG8gcmVjZWl2ZSBhbiBBUEkgZXJyb3IgaW5zdGVhZCBvZiBTaWduYWwgc2NvcmVzIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgYmFuayBkYXRhLCBmaWxlIGEgc3VwcG9ydCB0aWNrZXQgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2lnbmFsV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFNpZ25hbFdhcm5pbmc+O1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGFzc29jaWF0ZWQgZnVuZGluZyBhY2NvdW50LCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgcHJlc2VudCwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhpcyB0cmFuc2Zlci4gT25seSBwcmVzZW50IGlmIGNyZWF0ZWQgb24gYmVoYWxmIG9mIGFub3RoZXIgY2xpZW50IGFzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbn1cbi8qKlxuICogQ29tcHJpc2VzIGZpdmUgcmlzayBjYXRlZ29yaWVzIChoaWdoIHJpc2ssIG1lZGl1bS1oaWdoIHJpc2ssIG1lZGl1bSByaXNrLCBtZWRpdW0tbG93IHJpc2ssIGxvdyByaXNrKSBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgcmV0dXJuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWwge1xuICAgIEhpZ2hSaXNrID0gJ0hJR0hfUklTSycsXG4gICAgTWVkaXVtSGlnaFJpc2sgPSAnTUVESVVNX0hJR0hfUklTSycsXG4gICAgTWVkaXVtUmlzayA9ICdNRURJVU1fUklTSycsXG4gICAgTWVkaXVtTG93UmlzayA9ICdNRURJVU1fTE9XX1JJU0snLFxuICAgIExvd1Jpc2sgPSAnTE9XX1JJU0snXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuIFRoZSBgdXNlci5sZWdhbF9uYW1lYCBmaWVsZCBpcyByZXF1aXJlZC4gT3RoZXIgZmllbGRzIGFyZSBub3QgY3VycmVudGx5IHVzZWQgYW5kIGFyZSBwcmVzZW50IHRvIHN1cHBvcnQgcGxhbm5lZCBmdXR1cmUgZnVuY3Rpb25hbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuIElmIHRoZSB1c2VyIGlzIGEgYnVzaW5lc3MsIHByb3ZpZGUgdGhlIGJ1c2luZXNzIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBiYWxhbmNlLCBwbHVzIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2VUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYWxhbmNlLiAgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBSVFAgY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZCBgcHJlZnVuZGVkX2FjaF9jcmVkaXRzYCAtIFlvdXIgcHJlZnVuZGVkIEFDSCBjcmVkaXQgYmFsYW5jZSB3aXRoIFBsYWlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckJhbGFuY2VUeXBlIHtcbiAgICBSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdXBwb3J0ZWQgc2VydmljZSB0eXBlcyBpbiBSVFBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFBcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24gc3VwcG9ydHMgUlRQIGNyZWRpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFBcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zdXBwb3J0ZWRfbmV0d29ya3M6IEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3M7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X2RhaWx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IGFuZCBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZC4gYGF1dGhvcml6YXRpb25faWRgIGlzIG5vdyB1c2VkIGFzIGlkZW1wb3RlbmN5IGluc3RlYWQuICBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLiBUaGlzIHBhcmFtZXRlciBhbHNvIHNlcnZlcyB0aGUgcHVycG9zZSBvZiBhY3RpbmcgYXMgYW4gaWRlbXBvdGVuY3kgaWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0eXBlPzogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24uIE1heGltdW0gb2YgMTUgY2hhcmFjdGVycy4gSWYgcmVwcm9jZXNzaW5nIGEgcmV0dXJuZWQgdHJhbnNmZXIsIHBsZWFzZSBub3RlIHRoYXQgdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQgbXVzdCBiZSBgXFxcIlJldHJ5IDFcXFwiYCBvciBgXFxcIlJldHJ5IDJcXFwiYCB0byBpbmRpY2F0ZSB0aGF0IGl0XFwncyBhIHJldHJ5IG9mIGEgcHJldmlvdXNseSByZXR1cm5lZCB0cmFuc2Zlci4gWW91IG1heSByZXRyeSBhIHRyYW5zZmVyIHVwIHRvIDIgdGltZXMsIHdpdGhpbiAxODAgZGF5cyBvZiBjcmVhdGluZyB0aGUgb3JpZ2luYWwgdHJhbnNmZXIuIE9ubHkgdHJhbnNmZXJzIHRoYXQgd2VyZSByZXR1cm5lZCB3aXRoIGNvZGUgYFIwMWAgb3IgYFIwOWAgbWF5IGJlIHJldHJpZWQuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVzZXI/OiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgdHJhbnNmZXJgIGlzIGNyZWF0ZWQgYXQgdGhlIGB2aXJ0dWFsX3RpbWVgIG9uIHRoZSBwcm92aWRlZCBgdGVzdF9jbG9ja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBkZWR1Y3QgZnJvbSBgdHJhbnNmZXIuYW1vdW50YCBhbmQgZGlzdHJpYnV0ZSB0byB0aGUgcGxhdGZvcm3igJlzIExlZGdlciBiYWxhbmNlIGFzIGEgZmFjaWxpdGF0b3IgZmVlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFRoZSByZW1haW5kZXIgd2lsbCBnbyB0byB0aGUgZW5kLWN1c3RvbWVy4oCZcyBMZWRnZXIgYmFsYW5jZS4gVGhpcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYHRyYW5zZmVyLmFtb3VudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFjaWxpdGF0b3JfZmVlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGZpZWxkIGlzIG5vdyBkZXByZWNhdGVkLiBZb3UgbWF5IGlnbm9yZSBpdCBmb3IgdHJhbnNmZXJzIGNyZWF0ZWQgb24gYW5kIGFmdGVyIDEyLzAxLzIwMjMuICBTcGVjaWZpZXMgdGhlIHNvdXJjZSBvZiBmdW5kcyBmb3IgdGhlIHRyYW5zZmVyLiBPbmx5IHZhbGlkIGZvciBgY3JlZGl0YCB0cmFuc2ZlcnMsIGFuZCBkZWZhdWx0cyB0byBgc3dlZXBgIGlmIG5vdCBzcGVjaWZpZWQuIFRoaXMgZmllbGQgaXMgbm90IHNwZWNpZmllZCBmb3IgYGRlYml0YCB0cmFuc2ZlcnMuICBgc3dlZXBgIC0gU3dlZXAgZnVuZHMgZnJvbSB5b3VyIGZ1bmRpbmcgYWNjb3VudCBgcHJlZnVuZGVkX3J0cF9jcmVkaXRzYCAtIFVzZSB5b3VyIHByZWZ1bmRlZCBSVFAgY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZCBgcHJlZnVuZGVkX2FjaF9jcmVkaXRzYCAtIFVzZSB5b3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZSB7XG4gICAgU3dlZXAgPSAnc3dlZXAnLFxuICAgIFByZWZ1bmRlZFJ0cENyZWRpdHMgPSAncHJlZnVuZGVkX3J0cF9jcmVkaXRzJyxcbiAgICBQcmVmdW5kZWRBY2hDcmVkaXRzID0gJ3ByZWZ1bmRlZF9hY2hfY3JlZGl0cycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdXNhZ2Ugb2YgY3JlZGl0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBjcmVkaXQgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9mcmVxdWVuY3k6IE9yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBoaWdoZXN0IGFtb3VudCBmb3IgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGNyZWRpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2F2ZXJhZ2VfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIG1vbnRobHkgZXhwZWN0ZWQgQUNIIGNyZWRpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgdXNlIGNhc2VzIGZvciB0aGUgb3JpZ2luYXRvcuKAmXMgY3JlZGl0IHRyYW5zZmVycy4gVGhpcyBzaG91bGQgYmUgYSBsaXN0IHRoYXQgY29udGFpbnMgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb2RlczogIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGUuZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHNlY19jb2RlczogQXJyYXk8Q3JlZGl0QUNIQ2xhc3M+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGRlYml0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBkZWJpdCB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBkZWJpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGRlYml0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBtb250aGx5IGV4cGVjdGVkIEFDSCBkZWJpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBkZWJpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICAgICAqIEB0eXBlIHtBcnJheTxBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PEFDSENsYXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRldmljZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEZXZpY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBDbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3Igd2hvc2UgZG9jdW1lbnQgdGhhdCB5b3Ugd2FudCB0byB1cGxvYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZmlsZSB0byB1cGxvYWQuIFRoZSBmaWxlIHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gMjBNQi4gU3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uczogLnBkZi5cbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGZpbGU6IGFueTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEb2N1bWVudFB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgcHVycG9zZTogVHJhbnNmZXJEb2N1bWVudFB1cnBvc2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3LigJlzIGRpbGlnZW5jZSBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckRpbGlnZW5jZVN0YXR1cyB7XG4gICAgTm90U3VibWl0dGVkID0gJ25vdF9zdWJtaXR0ZWQnLFxuICAgIFN1Ym1pdHRlZCA9ICdzdWJtaXR0ZWQnLFxuICAgIFVuZGVyUmV2aWV3ID0gJ3VuZGVyX3JldmlldycsXG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIERlbmllZCA9ICdkZW5pZWQnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSB0aGUgb3JpZ2luYXRvciB3aG9zZSBkaWxpZ2VuY2UgdGhhdCB5b3Ugd2FudCB0byBzdWJtaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2RpbGlnZW5jZTogVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIHVwbG9hZGVkIGZpbGUuICBgXFxcIkRVRV9ESUxJR0VOQ0VcXFwiYCAtIFRoZSB0cmFuc2ZlciBkdWUgZGlsaWdlbmNlIGRvY3VtZW50IG9mIHRoZSBvcmlnaW5hdG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEb2N1bWVudFB1cnBvc2Uge1xuICAgIER1ZURpbGlnZW5jZSA9ICdEVUVfRElMSUdFTkNFJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBldmVudCBvY2N1cnJlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IFRyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgb21pdHRlZCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGFzc29jaWF0ZWQgZnVuZGluZyBhY2NvdW50LCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgcHJlc2VudCwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgYG51bGxgIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09taXR0YWJsZVRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBPbWl0dGFibGVUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9hbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaWduZWQgYW1vdW50IG9mIGhvdyBtdWNoIHdhcyBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgIGZvciB0aGlzIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIi01LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2Ftb3VudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLiBBIG5vbi1udWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZXZlbnQgaXMgZm9yIHRoZSBhc3NvY2lhdGVkIHJlZnVuZCBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIHRyYW5zZmVyIHRoYXQgdGhpcyBldmVudCBhcHBsaWVzIHRvLiBPbmx5IHByZXNlbnQgaWYgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl90eXBlPzogVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBldmVudHMgYnkgZXZlbnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PFRyYW5zZmVyRXZlbnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvciBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlciBldmVudHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBhZnRlcl9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgdHJhbnNmZXIgcmVwcmVzZW50cy4gRXZlbnQgdHlwZXMgd2l0aCBwcmVmaXggYHN3ZWVwYCByZXByZXNlbnRzIGV2ZW50cyBmb3IgUGxhaWQgTGVkZ2VyIHN3ZWVwcy4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuICBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHNldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuICBgcmV0dXJuZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuICBgc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHN3ZXB0IHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiAgYHJldHVybl9zd2VwdGA6IER1ZSB0byB0aGUgdHJhbnNmZXIgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVsbGVkIGZyb20gb3IgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlZXAucGVuZGluZ2A6IEEgbmV3IGxlZGdlciBzd2VlcCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgc3dlZXAucG9zdGVkYDogVGhlIGxlZGdlciBzd2VlcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgc3dlZXAuc2V0dGxlZGA6IFRoZSB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBpbiB0aGUgZnVuZGluZyBhY2NvdW50LiBUaGlzIG1lYW5zIHRoYXQgZnVuZHMgd2l0aGRyYXduIGZyb20gUGxhaWQgTGVkZ2VyIGJhbGFuY2UgaGF2ZSByZWFjaGVkIHRoZSBmdW5kaW5nIGFjY291bnQsIG9yIGZ1bmRzIHRvIGJlIGRlcG9zaXRlZCBpbnRvIHRoZSBQbGFpZCBMZWRnZXIgQmFsYW5jZSBoYXZlIGJlZW4gcHVsbGVkLCBhbmQgdGhlIGhvbGQgcGVyaW9kIGhhcyBiZWd1bi4gIGBzd2VlcC5yZXR1cm5lZGA6IEEgcG9zdGVkIGxlZGdlciBzd2VlcCB3YXMgcmV0dXJuZWQuICBgc3dlZXAuZmFpbGVkYDogVGhlIGxlZGdlciBzd2VlcCBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcmVmdW5kLnBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHJlZnVuZC5jYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQuICBgcmVmdW5kLmZhaWxlZGA6IFRoZSByZWZ1bmQgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZWZ1bmQuc2V0dGxlZGA6IFRoZSByZWZ1bmQgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5lZGA6IEEgcG9zdGVkIHJlZnVuZCB3YXMgcmV0dXJuZWQuICBgcmVmdW5kLnN3ZXB0YDogVGhlIHJlZnVuZCB3YXMgc3dlcHQgZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuX3N3ZXB0YDogRHVlIHRvIHRoZSByZWZ1bmQgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCcsXG4gICAgU3dlZXBQZW5kaW5nID0gJ3N3ZWVwLnBlbmRpbmcnLFxuICAgIFN3ZWVwUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU3dlZXBTZXR0bGVkID0gJ3N3ZWVwLnNldHRsZWQnLFxuICAgIFN3ZWVwUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIFN3ZWVwRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlZmluZXMgYW4gZXhwZWN0ZWQgc3dlZXAgZGF0ZSBhbmQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZW1lbnQgZGF0ZSBvZiBhIHN3ZWVwIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VlcF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjdW11bGF0ZWQgYW1vdW50IHRoYXQgaGFzIGJlZW4gc3dlcHQgYnkgYHN3ZWVwX3NldHRsZW1lbnRfZGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIHN3ZXB0X3NldHRsZWRfYW1vdW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgZXZlbnQgdHlwZSBmb3IgYSB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV0dXJuZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXR1cm5lZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9yaWdpbmF0b3JcXCdzIGZ1bmRpbmcgYWNjb3VudCwgbGlua2VkIHdpdGggUGxhaWQgTGluayBvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgQVBQUk9WRURgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSB0byByZS1hdXRoZW50aWNhdGUgeW91ciB1c2VyIHdoZW4gYGRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgSVRFTV9MT0dJTl9SRVFVSVJFRGApLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuICBgREVDTElORURgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50QXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmV0dXJuZWQgb25seSBpZiBgYWNjb3VudF9pZGAgd2FzIHNldCBvbiBpbnRlbnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxvdyBvZiB0cmFuc2ZlciBmdW5kcy4gIGBQQVlNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20gYW4gZW5kIHVzZXJcXCdzIGFjY291bnQgdG8geW91ciBidXNpbmVzcyBhY2NvdW50LiAgYERJU0JVUlNFTUVOVGA6IFRyYW5zZmVycyBmdW5kcyBmcm9tIHlvdXIgYnVzaW5lc3MgYWNjb3VudCB0byBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZSB7XG4gICAgUGF5bWVudCA9ICdQQVlNRU5UJyxcbiAgICBEaXNidXJzZW1lbnQgPSAnRElTQlVSU0VNRU5UJ1xufVxuXG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gRGVmYXVsdHMgdG8gYHNhbWUtZGF5LWFjaGAuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA1OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXM7IHRoaXMgd2lsbCBhcHBseSB0byBib3RoIGxlZ3Mgb2YgdGhlIHRyYW5zZmVyIGlmIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIFNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcyBvbmx5LiBJZiB1c2luZyBQbGFpZCBMZWRnZXIsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIGFuZCB5b3UgYXJlIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gT3RoZXJ3aXNlLCBQbGFpZCBMZWRnZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50Q3JlYXRlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJldHVybmVkIG9ubHkgaWYgYGFjY291bnRfaWRgIHdhcyBzZXQgb24gaW50ZW50IGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIGludGVudCBzdGF0dXMgaXMgYGZhaWxlZGAuIE51bGwgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQgKGkuZS4sIGFuIEFQSSBlcnJvciBvciB0aGUgYXV0aG9yaXphdGlvbiBiZWluZyBkZWNsaW5lZCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEdldH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudDogVHJhbnNmZXJJbnRlbnRHZXQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIGludGVudC4gIGBQRU5ESU5HYDogVGhlIHRyYW5zZmVyIGludGVudCBpcyBwZW5kaW5nLiBgU1VDQ0VFREVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIGBGQUlMRURgOiBUaGUgdHJhbnNmZXIgaW50ZW50IHdhcyB1bmFibGUgdG8gYmUgY3JlYXRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50U3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFN1Y2NlZWRlZCA9ICdTVUNDRUVERUQnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2Ugb2YgdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGlzIGJhbGFuY2UgYXZhaWxhYmxlIGZvciB1c2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHBlbmRpbmcgZnVuZHMgdGhhdCBhcmUgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5b3V0IG9yIGNvbGxlY3QgZnVuZHMuIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW914oCZcmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IGxpbmtlZCB0byB0aGlzIFBsYWlkIExlZGdlciB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuIElmIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAgaXMgc3BlY2lmaWVkLCB0aGUgYGZ1bmRpbmdfYWNjb3VudF9pZGAgbXVzdCBiZWxvbmcgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yLCBhbmQgaWYgYGZ1bmRpbmdfYWNjb3VudF9pZGAgaXMgbGVmdCBibGFuaywgdGhlIG9yaWdpbmF0b3JcXCdzIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgZGVwb3NpdGVkIGludG8gbGVkZ2VyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRlcG9zaXQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGVwb3NpdCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkZXBvc2l0IGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckFDSE5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2ZlckFDSE5ldHdvcms7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IFRyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgdG8gcHVsbCBtb25leSBmcm9tLiBNdXN0IGJlIHRoZSBwbGF0Zm9ybSBpdHNlbGYgb3IgaXRzIG9yaWdpbmF0b3IuIE9uZSBvZiBgZnJvbV9jbGllbnRfaWRgIGFuZCBgdG9fY2xpZW50X2lkYCBtdXN0IGJlIHRoZSBwbGF0Zm9ybVxcJ3MgYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyb21fY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCB0byBjcmVkaXQgbW9uZXkgdG8uIE11c3QgYmUgdGhlIHBsYXRmb3JtIGl0c2VsZiBvciBpdHMgb3JpZ2luYXRvci4gT25lIG9mIGBmcm9tX2NsaWVudF9pZGAgYW5kIGB0b19jbGllbnRfaWRgIG11c3QgYmUgdGhlIHBsYXRmb3JtXFwncyBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgdG9fY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCB0byBtb3ZlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIEFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgZGlzdHJpYnV0ZS4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciBkaXN0cmlidXRlIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGRpc3RyaWJ1dGUgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBsZWRnZXIgZGlzdHJpYnV0ZSBvcGVyYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckxlZGdlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBsZWRnZXIgc3dlZXAgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAucG9zdGVkYCAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAuZmFpbGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5zZXR0bGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgIGBzd2VlcC5zZXR0bGVkYCAtLT4gYHN3ZWVwLnJldHVybmVkYCBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZSB7XG4gICAgUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBjdXN0b21lciB0aGF0IG93bnMgdGhlIExlZGdlciBiYWxhbmNlLiBUaGlzIGlzIHNvIFBsYWlkIGtub3dzIHdoaWNoIG9mIHlvdXIgY3VzdG9tZXJzIHRvIHBheW91dCBvciBjb2xsZWN0IGZ1bmRzLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtQbGF0Zm9ybSBjdXN0b21lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuIERvIG5vdCBpbmNsdWRlIGlmIHlvdeKAmXJlIHBheWluZyBvdXQgdG8geW91cnNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBmdW5kaW5nIGFjY291bnQgbGlua2VkIHRvIHRoaXMgUGxhaWQgTGVkZ2VyIHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IsIGFuZCBpZiBgZnVuZGluZ19hY2NvdW50X2lkYCBpcyBsZWZ0IGJsYW5rLCB0aGUgb3JpZ2luYXRvclxcJ3MgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlciBiYWxhbmNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgd2l0aGRyYXcuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2l0aGRyYXcgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2RlYml0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGFpbHlfY3JlZGl0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBhbmQgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbW9udGhseV90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gY3VycmVudCBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbW9udGhseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfY3JlZGl0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIFRoaXMgaXMgdGhlIEFCQSBudW1iZXI7IGZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIEFDSCBudW1iZXIgdXNlZCBpbiBgcm91dGluZ19udW1iZXJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYGFjaGAsIHRoZSBuZXh0LWRheSBjdXRvZmYgaXMgNTozMCBQTSBFYXN0ZXJuIFRpbWUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgc2FtZS1kYXktYWNoYCwgdGhlIHNhbWUtZGF5IGN1dG9mZiBpcyAzOjMwIFBNIEVhc3Rlcm4gVGltZS4gSWYgdGhlIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhZnRlciB0aGlzIGN1dG9mZiBidXQgYmVmb3JlIHRoZSBuZXh0LWRheSBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzOyB0aGlzIHdpbGwgYXBwbHkgdG8gYm90aCBsZWdzIG9mIHRoZSB0cmFuc2ZlciBpZiBhcHBsaWNhYmxlLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHJ0cGAsICBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgcm91dGUgYmV0d2VlbiBSZWFsIFRpbWUgUGF5bWVudCByYWlsIGJ5IFRDSCBvciBGZWROb3cgcmFpbHMgYXMgbmVjZXNzYXJ5LiBJZiBhIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhcyBgcnRwYCBhbmQgdGhlIGNvdW50ZXJwYXJ0eSBhY2NvdW50IGlzIG5vdCBlbGlnaWJsZSBmb3IgUlRQLCB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgcmVxdWVzdCB3aWxsIGZhaWwgd2l0aCBhbiBgSU5WQUxJRF9GSUVMRGAgZXJyb3IgY29kZS4gVG8gcHJlLWNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIGEgY291bnRlcnBhcnR5IGFjY291bnQgY2FuIHN1cHBvcnQgUlRQLCBjYWxsIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgYmVmb3JlIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBSdHAgPSAncnRwJ1xufVxuXG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR3by1sZXR0ZXIgY29kZSBmb3IgdGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIgYmVpbmcgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwdWJsaWMtZmFjaW5nIHN1cmZhY2VzLCBlLmcuIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yLiBUaGlzIGlkZW50aWZpZXIgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIGFuZCBzaG91bGQgYmUgc3RvcmVkIGFzc29jaWF0ZWQgd2l0aCBlbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYXRvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRiYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggSUQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgdGF4X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBjcmVkaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZGViaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTkFJQ1MgY29kZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBuYWljc19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyIChpLmUuIHRoZSBvcmlnaW5hdG9yKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGV0YWlsZWRPcmlnaW5hdG9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3I6IERldGFpbGVkT3JpZ2luYXRvcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxPcmlnaW5hdG9yPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcnM6IEFycmF5PE9yaWdpbmF0b3I+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRoZSBlbmQgY3VzdG9tZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGFmdGVyIGNvbXBsZXRpbmcgcXVlc3Rpb25zIGluIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVSTCB0aGF0IHlvdSB3aWxsIHJlZGlyZWN0IHRoZSBlbmQgY3VzdG9tZXIgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbmJvYXJkaW5nX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWN1cnJpbmcgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWN1cnJpbmcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZW5kIHVzZXIgaXMgaW5pdGlhdGluZyB0aGUgc3BlY2lmaWMgdHJhbnNmZXIgdGhlbXNlbHZlcyB2aWEgYW4gaW50ZXJhY3RpdmUgVUksIHRoaXMgc2hvdWxkIGJlIGB0cnVlYDsgZm9yIGF1dG9tYXRpYyByZWN1cnJpbmcgcGF5bWVudHMgd2hlcmUgdGhlIGVuZCB1c2VyIGlzIG5vdCBhY3R1YWxseSBpbml0aWF0aW5nIGVhY2ggaW5kaXZpZHVhbCB0cmFuc2ZlciwgaXQgc2hvdWxkIGJlIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfcHJlc2VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBjcmVhdGVkIGByZWN1cnJpbmdfdHJhbnNmZXJgIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiBOZXcgb3JpZ2luYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIGB0ZXN0X2Nsb2NrYCBhZHZhbmNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogVHJhbnNmZXJEZXZpY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXI/OiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9yYXRpb25hbGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyOiBSZWN1cnJpbmdUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2ZlcnM6IEFycmF5PFJlY3VycmluZ1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBiZSBleGVjdXRlZCBvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF91bml0OiBUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVjdXJyaW5nIGBpbnRlcnZhbF91bml0c2AgYmV0d2VlbiBvcmlnaW5hdGlvbnMuIFRoZSByZWN1cnJpbmcgaW50ZXJ2YWwgKGJlZm9yZSBob2xpZGF5IGFkanVzdG1lbnQpIGlzIGNhbGN1bGF0ZWQgYnkgbXVsdGlwbHlpbmcgYGludGVydmFsX3VuaXRgIGFuZCBgaW50ZXJ2YWxfY291bnRgLiBGb3IgZXhhbXBsZSwgdG8gc2NoZWR1bGUgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2hpY2ggb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IHR3byB3ZWVrcywgc2V0IGBpbnRlcnZhbF91bml0YCA9IGB3ZWVrYCBhbmQgYGludGVydmFsX2NvdW50YCA9IDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHRyYW5zZmVyLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgd2Vla2AsIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNSAoRnJpZGF5KS4gIElmIHRoZSBgaW50ZXJ2YWxfdW5pdGAgaXMgYG1vbnRoYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgdHJhbnNmZXIgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi4gIFRoZSB0cmFuc2ZlciB3aWxsIGJlIG9yaWdpbmF0ZWQgb24gdGhlIG5leHQgYXZhaWxhYmxlIGJhbmtpbmcgZGF5IGlmIHRoZSBkZXNpZ25hdGVkIGRheSBpcyBhIG5vbiBiYW5raW5nIGRheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiAgYGFjdGl2ZWA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3VycmVudGx5IGFjdGl2ZS4gYGNhbmNlbGxlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50IG9yIFBsYWlkLiBgZXhwaXJlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCBhbGwgb3JpZ2luYXRpb25zIGFjY29yZGluZyB0byBpdHMgcmVjdXJyaW5nIHNjaGVkdWxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVmdW5kIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHJlZnVuZCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWZ1bmRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIHJlZnVuZCB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSByZWZ1bmQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWZ1bmQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWZ1bmQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVmdW5kIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBldmVudCB0eXBlIGZvciBhIHJlZnVuZCBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV0dXJuZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgcmVmdW5kIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVmdW5kLiAgYHBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuIGBzZXR0bGVkYDogQ3JlZGl0cyBoYXZlIGJlZW4gcmVmdW5kZWQgdG8gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiBgY2FuY2VsbGVkYDogVGhlIHJlZnVuZCB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIGBmYWlsZWRgOiBUaGUgcmVmdW5kIGhhcyBmYWlsZWQuIGByZXR1cm5lZGA6IFRoZSByZWZ1bmQgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWZ1bmRTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCdcbn1cblxuLyoqXG4gKiBBIHJlcGF5bWVudCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgb25lIG9yIG1vcmUgZ3VhcmFudGVlZCB0cmFuc2FjdGlvbnMgcmVjZWl2ZSBhIHJldHVybi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsaWdpYmxlIHJldHVybnMgaW4gYSBkYXksIHRoZXkgYXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byBhIHNpbmdsZSByZXBheW1lbnQuICBSZXBheW1lbnRzIGFyZSBzZW50IG92ZXIgQUNILCB3aXRoIGZ1bmRzIHR5cGljYWxseSBhdmFpbGFibGUgb24gdGhlIG5leHQgYmFua2luZyBkYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSByZXBheW1lbnQgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZWNpbWFsIGFtb3VudCBvZiB0aGUgcmVwYXltZW50IGFzIGl0IGFwcGVhcnMgb24geW91ciBhY2NvdW50IGxlZGdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRzOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0dXJuIG9uIGEgR3VhcmFudGVlZCBBQ0ggdHJhbnNmZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBndWFyYW50ZWVkIHRyYW5zZmVyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYHJldHVybmVkYCB0cmFuc2ZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50IHRvIHF1ZXJ5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvcmV0dXJuL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwYXltZW50X3JldHVybnM6IEFycmF5PFRyYW5zZmVyUmVwYXltZW50UmV0dXJuPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB1bml0IG9mIHRoZSByZWN1cnJpbmcgaW50ZXJ2YWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0IHtcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIE1vbnRoID0gJ21vbnRoJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiBgc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBQbGFpZCBsaW5rZWQgYWNjb3VudC4gYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiBgcmV0dXJuZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHN3ZWVwIG9mIGZ1bmRzIHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIEEgc3dlZXAgaXMgYXNzb2NpYXRlZCB3aXRoIG1hbnkgc3dlZXAgZXZlbnRzIChldmVudHMgb2YgdHlwZSBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgKSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYHN3ZWVwX2lkYC4gIGBzd2VwdGAgZXZlbnRzIG9jY3VyIHdoZW4gdGhlIHRyYW5zZmVyIGFtb3VudCBpcyBjcmVkaXRlZCBvciBkZWJpdGVkIGZyb20geW91ciBzd2VlcCBhY2NvdW50LCBkZXBlbmRpbmcgb24gdGhlIGB0eXBlYCBvZiB0aGUgdHJhbnNmZXIuIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIGEgdHJhbnNmZXIgaXMgcmV0dXJuZWQgYW5kIFBsYWlkIHVuZG9lcyB0aGUgY3JlZGl0IG9yIGRlYml0LiAgVGhlIHRvdGFsIHN1bSBvZiB0aGUgYHN3ZXB0YCBhbmQgYHJldHVybl9zd2VwdGAgZXZlbnRzIGlzIGVxdWFsIHRvIHRoZSBgYW1vdW50YCBvZiB0aGUgc3dlZXAgUGxhaWQgY3JlYXRlcyBhbmQgbWF0Y2hlcyB0aGUgYW1vdW50IG9mIHRoZSBlbnRyeSBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGUgc3dlZXAgb2NjdXJyZWQsIGluIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBkZWNpbWFsIGFtb3VudCBvZiB0aGUgc3dlZXAgYXMgaXQgYXBwZWFycyBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyIChlLmcuIFxcXCItMTAuMDBcXFwiKSAgSWYgYW1vdW50IGlzIG5vdCBwcmVzZW50LCB0aGUgc3dlZXAgd2FzIG5ldC1zZXR0bGVkIHRvIHplcm8gYW5kIG91dHN0YW5kaW5nIGRlYml0cyBhbmQgY3JlZGl0cyBiZXR3ZWVuIHRoZSBzd2VlcCBhY2NvdW50IGFuZCBQbGFpZCBhcmUgYmFsYW5jZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgc3dlZXAsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3dlZXAgc2V0dGxlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzZXR0bGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgdHJpZ2dlcj86IFN3ZWVwVHJpZ2dlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBDdXJyZW50bHksIHRoZSBmaWVsZCB3aWxsIHJlbWFpbiBudWxsIGZvciB0cmFuc2ZlcnMgb24gb3RoZXIgcmFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3dlZXAgKFVVSUQpIG9yIGEgc2hvcnRlbmVkIGZvcm0gY29uc2lzdGluZyBvZiB0aGUgZmlyc3QgOCBjaGFyYWN0ZXJzIG9mIHRoZSBpZGVudGlmaWVyICg4LWRpZ2l0IGhleGFkZWNpbWFsIHN0cmluZykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2VlcHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHN3ZWVwcyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFN3ZWVwU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgc3dlZXBzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgc3dlZXBzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIGluY2x1ZGVkIGB0cmFuc2Zlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcFRyaWdnZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclN3ZWVwPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8VHJhbnNmZXJTd2VlcD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHN3ZWVwIGZvciB0aGUgdHJhbnNmZXIuICBgdW5zd2VwdGA6IFRoZSB0cmFuc2ZlciBoYXNuXFwndCBiZWVuIHN3ZXB0IHlldC4gYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byB0aGUgc3dlZXAgYWNjb3VudC4gYHN3ZXB0X3NldHRsZWRgOiBDcmVkaXRzIGFyZSBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIG9yIGRlYml0cyBoYXZlIGJlZW4gZGVkdWN0ZWQgZnJvbSB0aGUgY3VzdG9tZXLigJlzIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnQuIGByZXR1cm5fc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBiYWNrIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiBgbnVsbGA6IFRoZSB0cmFuc2ZlciB3aWxsIG5ldmVyIGJlIHN3ZXB0IChlLmcuIGlmIHRoZSB0cmFuc2ZlciBpcyBjYW5jZWxsZWQgb3IgcmV0dXJuZWQgYmVmb3JlIGJlaW5nIHN3ZXB0KVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTd2VlcFN0YXR1cyB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBVbnN3ZXB0ID0gJ3Vuc3dlcHQnLFxuICAgIFN3ZXB0ID0gJ3N3ZXB0JyxcbiAgICBTd2VwdFNldHRsZWQgPSAnc3dlcHRfc2V0dGxlZCcsXG4gICAgUmV0dXJuU3dlcHQgPSAncmV0dXJuX3N3ZXB0J1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHRlc3QgY2xvY2sgZm9yIGEgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclRlc3RDbG9jayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXguIFxcXCJTYW4gRnJhbmNpc2NvXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIChlLmcuLCBcXFwiVVNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ0FcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgZWRpdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGAgd2ViaG9vayBpcyBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoZSB1c2VyIGNhbiByZXN0b3JlIGFjY2VzcyB0byB0aGUgcmV2b2tlZCBhY2NvdW50IGJ5IHJlZ3JhbnRpbmcgcGVybWlzc2lvbnMgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBpbiBiZXRhLiBJdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBHQSBpbiBKYW4gMjAyNC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRSZXZva2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIG9mIHRoZSBhZmZlY3RlZCBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEhvbWUgYWRkcmVzcyBmb3IgdGhlIHVzZXIuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBub3QgcHJvdmlkZWQsIGFkZHJlc3Mgd2l0aCBvbmx5IGNvdW50cnkgY29kZSBvciBmdWxsIGFkZHJlc3MuICBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSW5wdXQgVmFsaWRhdGlvbiBieSBDb3VudHJ5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8jaW5wdXQtdmFsaWRhdGlvbi1ieS1jb3VudHJ5KS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFkZHJlc3NcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDdXN0b21QYXNzd29yZCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlcklETnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYCB3ZWJob29rIG1heSBiZSBmaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyB1c2VkIGVpdGhlciB0aGUgW215LnBsYWlkLmNvbSBwb3J0YWxdKGh0dHBzOi8vbXkucGxhaWQuY29tKSBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9u4oCZcyBPQXV0aCBjb25zZW50IHBvcnRhbCB0byByZXZva2UgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gVGhpcyB3ZWJob29rIGlzIG5vdCBndWFyYW50ZWVkIHRvIGFsd2F5cyBiZSBmaXJlZCB1cG9uIGNvbnNlbnQgcmV2b2NhdGlvbiwgc2luY2Ugc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gT25jZSBhY2Nlc3MgdG8gYW4gSXRlbSBoYXMgYmVlbiByZXZva2VkLCBpdCBjYW5ub3QgYmUgcmVzdG9yZWQuIElmIHRoZSB1c2VyIHN1YnNlcXVlbnRseSByZXR1cm5zIHRvIHlvdXIgYXBwbGljYXRpb24sIGEgbmV3IEl0ZW0gbXVzdCBiZSBjcmVhdGVkIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIGluY29tZSBjYXRlZ29yeSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5IHtcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IGZyZXF1ZW5jeSBvZiBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBUaGUgcGF5IHR5cGUgLSBgR1JPU1NgLCBgTkVUYCwgb3IgYFVOS05PV05gIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBHcm9zcyA9ICdHUk9TUycsXG4gICAgTmV0ID0gJ05FVCdcbn1cblxuLyoqXG4gKiBVc2VyVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eT86IENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBVc2VyVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWYWxpZGF0aW9uU291cmNlXG4gICAgICovXG4gICAgVmFsaWRhdGlvblNvdXJjZVJlZmVyZW5jZUlkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxWYWxpZGF0aW9uU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZXNcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRTogQXJyYXk8VmFsaWRhdGlvblNvdXJjZT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSB3YXMgbm90IHZlcmlmaWVkIHZpYSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdHMgYWZ0ZXIgc2V2ZW4gZGF5cyBzaW5jZSB0aGUgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXQgd2FzIG1hZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9FWFBJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRpbmdJbmZvcm1hdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogUmVwb3J0aW5nSW5mb3JtYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnR9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBTRVJWSUNFX1BST0RVQ1RfRlVMRklMTE1FTlQ6IFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVF9SRVNQT05TRTogVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0c31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBBc3NldHM7XG59XG4vKipcbiAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVEFUVVNfVVNFUl9QUkVTRU5DRV9SRVFVSVJFRFxcXCJgIFVzZXIgcHJlc2VuY2UgaXMgcmVxdWlyZWQgdG8gcmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uLiBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUxcXFwiYCBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoIHdhcyBzdWNjZXNzZnVsLiBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORFxcXCJgIE5vIG5ldyBkYXRhIHdhcyBmb3VuZCBhZnRlciB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiByZWZyZXNoLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uUmVmcmVzaFN0YXR1cyB7XG4gICAgU3RhdHVzVXNlclByZXNlbmNlUmVxdWlyZWQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRUQnLFxuICAgIFN1Y2Nlc3NmdWwgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1VDQ0VTU0ZVTCcsXG4gICAgTm90Rm91bmQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfTk9UX0ZPVU5EJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJRURcXFwiYDogVGhlIGluZm9ybWF0aW9uIHdhcyBzdWNjZXNzZnVsbHkgdmVyaWZpZWQuICBgXFxcIlVOVkVSSUZJRURcXFwiYDogVGhlIHZlcmlmaWNhdGlvbiBoYXMgbm90IHlldCBiZWVuIHBlcmZvcm1lZC4gIGBcXFwiTkVFRFNfSU5GT1xcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHdhcyBhdHRlbXB0ZWQgYnV0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIG1pc3NpbmcgaW5mb3JtYXRpb24uICBcXFwiYFVOQUJMRV9UT19WRVJJRllgXFxcIjogVGhlIHZlcmlmaWNhdGlvbiB3YXMgcGVyZm9ybWVkIGFuZCB0aGUgaW5mb3JtYXRpb24gY291bGQgbm90IGJlIHZlcmlmaWVkLiAgYFxcXCJVTktOT1dOXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIFZlcmlmaWVkID0gJ1ZFUklGSUVEJyxcbiAgICBVbnZlcmlmaWVkID0gJ1VOVkVSSUZJRUQnLFxuICAgIE5lZWRzSW5mbyA9ICdORUVEU19JTkZPJyxcbiAgICBVbmFibGVUb1ZlcmlmeSA9ICdVTkFCTEVfVE9fVkVSSUZZJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogVzIgaXMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBpbmNvbWUgZGF0YSB0YWtlbiBmcm9tIGEgVzIgdGF4IGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVzIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llZT86IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggeWVhciBvZiB0aGUgVzIgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZWUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV93YWdlcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSBtZWRpY2FyZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG1lZGljYXJlX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvY2F0ZWQgdGlwcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGJveF85Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOb25xdWFsaWZpZWQgcGxhbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyPn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfMTI/OiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJldGlyZW1lbnQgcGxhbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHJldGlyZW1lbnRfcGxhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcmQgcGFydHkgc2ljayBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBvdGhlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz47XG59XG4vKipcbiAqIERhdGEgb24gdGhlIFcyIEJveCAxMlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMkJveDEyXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXMkJveDEyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVzIgQm94IDEyIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJCb3gxMlxuICAgICAqL1xuICAgIGNvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJCb3gxMlxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBTdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdhZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGVtcGxveWVyX3N0YXRlX2lkX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGVfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbF9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG59XG4vKipcbiAqIFdhbGxldENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogV2FsbGV0QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgZS13YWxsZXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IFdhbGxldEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZSwgdXNlZCB3aXRoIGUtd2FsbGV0cyBhbmQgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0SVNPQ3VycmVuY3lDb2RlIHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJ1xufVxuXG4vKipcbiAqIFdhbGxldExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBXYWxsZXRJU09DdXJyZW5jeUNvZGU7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgZS13YWxsZXQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGF0IGUtd2FsbGV0LiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGUtd2FsbGV0cyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBlLXdhbGxldHMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBXYWxsZXRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGUtd2FsbGV0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRzOiBBcnJheTxXYWxsZXQ+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBlLXdhbGxldHMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCBlLXdhbGxldCBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldE51bWJlcnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxJQkFOfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IHNjaGVtZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyB0cmFuc2FjdGlvbi4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQQVlPVVRgIGFuZCBgUkVGVU5EYC4gIGBGQVNURVJfUEFZTUVOVFNgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCBzY2hlbWUgd2l0aGluIHRoZSBVSy4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0UGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBGYXN0ZXJQYXltZW50cyA9ICdGQVNURVJfUEFZTUVOVFMnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHdhbGxldC4gIGBVTktOT1dOYDogVGhlIHdhbGxldCBzdGF0dXMgaXMgdW5rbm93bi4gIGBBQ1RJVkVgOiBUaGUgd2FsbGV0IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gc2VuZCBtb25leSB0byBhbmQgcmVjZWl2ZSBtb25leSBmcm9tLiAgYENMT1NFRGA6IFRoZSB3YWxsZXQgaXMgY2xvc2VkLiBBbnkgdHJhbnNhY3Rpb25zIG1hZGUgdG8gb3IgZnJvbSB0aGlzIHdhbGxldCB3aWxsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0U3RhdHVzIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEFjdGl2ZSA9ICdBQ1RJVkUnLFxuICAgIENsb3NlZCA9ICdDTE9TRUQnXG59XG5cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9uIGRldGFpbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25cbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHdhbGxldCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQW1vdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciBmb3IgYSBXYWxsZXQgVHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHlcXCdzIGJhbmsgYWNjb3VudCBudW1iZXJzLiBFeGFjdGx5IG9uZSBvZiBJQkFOIG9yIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWx9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWwgfCBudWxsO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLiBFbnN1cmUgdGhhdCB0aGUgYHJlZmVyZW5jZWAgZmllbGQgaXMgdW5pcXVlIGZvciBlYWNoIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZXJyb3IgY29kZSBvZiBhIGZhaWxlZCB0cmFuc2FjdGlvbi4gRXJyb3IgY29kZXMgaW5jbHVkZTogYEVYVEVSTkFMX1NZU1RFTWA6IFRoZSB0cmFuc2FjdGlvbiB3YXMgZGVjbGluZWQgYnkgYW4gZXh0ZXJuYWwgc3lzdGVtLiBgRVhQSVJFRGA6IFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGhhcyBleHBpcmVkLiBgQ0FOQ0VMTEVEYDogVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2FzIHJlc2NpbmRlZC4gYElOVkFMSURgOiBUaGUgdHJhbnNhY3Rpb24gZGlkIG5vdCBtZWV0IGNlcnRhaW4gY3JpdGVyaWEsIHN1Y2ggYXMgYW4gaW5hY3RpdmUgYWNjb3VudCBvciBubyB2YWxpZCBjb3VudGVycGFydHksIGV0Yy4gYFVOS05PV05gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIHVuc3VjY2Vzc2Z1bCwgYnV0IHRoZSBleGFjdCBjYXVzZSBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHtcbiAgICBFeHRlcm5hbFN5c3RlbSA9ICdFWFRFUk5BTF9TWVNURU0nLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCcsXG4gICAgQ2FuY2VsbGVkID0gJ0NBTkNFTExFRCcsXG4gICAgSW52YWxpZCA9ICdJTlZBTElEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYmFzZTY0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuIFNldCB0aGlzIHRvIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgZnJvbSB0aGUgcHJldmlvdXMgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhhdCB0cmFuc2FjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgd2FsbGV0IHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMgb2YgYW4gZS13YWxsZXQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHdhbGxldF9pZGBcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0IHRvIGZldGNoIHRyYW5zYWN0aW9ucyBmcm9tXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgdHJhbnNhY3Rpb24uIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gdHJhbnNhY3Rpb25zIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gQXNzZXQgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB3YXJuaW5nIGRhdGEgaW4gdGhlIHJlc3BvbnNlLCBpbmRpY2F0aW5nIHdoeSBvYnRhaW5pbmcgdGhlIG93bmVyIGluZm9ybWF0aW9uIGZhaWxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FybmluZ1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIHR5cGUsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBBU1NFVF9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgT1dORVJTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuYElOVkVTVE1FTlRTX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCBJbnZlc3RtZW50cyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogV2FybmluZ1dhcm5pbmdDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F1c2V9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ2F1c2U7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBJbnZlc3RtZW50c1VuYXZhaWxhYmxlID0gJ0lOVkVTVE1FTlRTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBraW5kIG9mIG9mZmljaWFsIGRvY3VtZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LiAgYGJpcnRoX2NlcnRpZmljYXRlYCAtIEEgY2VydGlmaWNhdGUgb2YgYmlydGggIGBkcml2ZXJzX2xpY2Vuc2VgIC0gQSBsaWNlbnNlIHRvIG9wZXJhdGUgYSBtb3RvciB2ZWhpY2xlICBgaW1taWdyYXRpb25fbnVtYmVyYCAtIEltbWlncmF0aW9uIG9yIHJlc2lkZW5jZSBkb2N1bWVudHMgIGBtaWxpdGFyeV9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYSBtaWxpdGFyeSBncm91cCAgYG90aGVyYCAtIEFueSBkb2N1bWVudCBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcGFzc3BvcnRgIC0gQW4gb2ZmaWNpYWwgcGFzc3BvcnQgaXNzdWUgYnkgYSBnb3Zlcm5tZW50ICBgcGVyc29uYWxfaWRlbnRpZmljYXRpb25gIC0gQW55IGdlbmVyaWMgcGVyc29uYWwgaWRlbnRpZmljYXRpb24gdGhhdCBpcyBub3QgY292ZXJlZCBieSBvdGhlciBjYXRlZ29yaWVzICBgcmF0aW9uX2NhcmRgIC0gSWRlbnRpZmljYXRpb24gdGhhdCBlbnRpdGxlcyB0aGUgaG9sZGVyIHRvIHJhdGlvbnMgIGBzc25gIC0gVW5pdGVkIFN0YXRlcyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyICBgc3R1ZGVudF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgYnkgYW4gZWR1Y2F0aW9uYWwgaW5zdGl0dXRpb24gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzICBgdHJhdmVsX2RvY3VtZW50YCAtIFZpc2FzLCBlbnRyeSBwZXJtaXRzLCByZWZ1Z2VlIGRvY3VtZW50cywgZXRjLiAgYHZvdGVyX2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygdm90aW5nXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGUge1xuICAgIEJpcnRoQ2VydGlmaWNhdGUgPSAnYmlydGhfY2VydGlmaWNhdGUnLFxuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSW1taWdyYXRpb25OdW1iZXIgPSAnaW1taWdyYXRpb25fbnVtYmVyJyxcbiAgICBNaWxpdGFyeUlkID0gJ21pbGl0YXJ5X2lkJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGFzc3BvcnQgPSAncGFzc3BvcnQnLFxuICAgIFBlcnNvbmFsSWRlbnRpZmljYXRpb24gPSAncGVyc29uYWxfaWRlbnRpZmljYXRpb24nLFxuICAgIFJhdGlvbkNhcmQgPSAncmF0aW9uX2NhcmQnLFxuICAgIFNzbiA9ICdzc24nLFxuICAgIFN0dWRlbnRJZCA9ICdzdHVkZW50X2lkJyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnLFxuICAgIFRyYXZlbERvY3VtZW50ID0gJ3RyYXZlbF9kb2N1bWVudCcsXG4gICAgVm90ZXJJZCA9ICd2b3Rlcl9pZCdcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBlbnRpdHkgc2NyZWVuaW5nIHJldmlld1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQSBwcm9ncmFtIHRoYXQgY29uZmlndXJlcyB0aGUgYWN0aXZlIGxpc3RzLCBzZWFyY2ggcGFyYW1ldGVycywgYW5kIG90aGVyIGJlaGF2aW9yIGZvciBpbml0aWFsIGFuZCBvbmdvaW5nIHNjcmVlbmluZyBvZiBlbnRpdGllcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBlbmFibGVkIGFuZCB3aWxsIHBlcmZvcm0gZGFpbHkgcmVzY2Fucy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpc3RzX2VuYWJsZWQ6IFNldDxFbnRpdHlXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBlbnRpdHkgcHJvZ3JhbSB0byBkZWZpbmUgaXRzIHB1cnBvc2UuIEZvciBleGFtcGxlLCBcXFwiSGlnaCBSaXNrIE9yZ2FuaXphdGlvbnNcXFwiIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2dyYW1OYW1lU2Vuc2l0aXZpdHl9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19hcmNoaXZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RQcm9ncmFtPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbXM6IEFycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyByZXZpZXdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyByZXZpZXdzXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX3Jldmlld3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zPzogVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IG9yIFBFUCBsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pdmVyc2FsIGlkZW50aWZpZXIgZm9yIGEgd2F0Y2hsaXN0IGluZGl2aWR1YWwgdGhhdCBpcyBzdGFibGUgYWNyb3NzIHNlYXJjaGVzIGFuZCB1cGRhdGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHBsYWlkX3VpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2Ugc2FuY3Rpb24gb3Igd2F0Y2hsaXN0LiBXaGVuIG9uZSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgc291cmNlX3VpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogU2NyZWVuaW5nSGl0QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NjcmVlbmluZ0hpdERhdGF9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGRhdGE/OiBTY3JlZW5pbmdIaXREYXRhO1xufVxuLyoqXG4gKiBMb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbG9jYXRpb24gc3RyaW5nLCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgZWxlbWVudHMgbGlrZSBzdHJlZXQsIGNpdHksIHBvc3RhbCBjb2RlcyBhbmQgY291bnRyeSBjb2Rlcy4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgY29tcGxldGUgb3Igd2VsbC1mb3JtYXR0ZWQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHJldmlldy4gQWxsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0cyBiZWdpbiBpbiBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUgYnV0IGNhbiBiZSBjaGFuZ2VkIGJ5IGNyZWF0aW5nIGEgcmV2aWV3LiBXaGVuIGEgaGl0IGlzIGluIHRoZSBgcGVuZGluZ19yZXZpZXdgIHN0YXRlLCBpdCB3aWxsIGFsd2F5cyBzaG93IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgd2F0Y2hsaXN0IGRhdGEgUGxhaWQgaGFzIGF2YWlsYWJsZSBhbmQgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgbGF0ZXN0IGN1c3RvbWVyIGluZm9ybWF0aW9uIHNhdmVkIGluIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBPbmNlIGEgaGl0IGhhcyBiZWVuIG1hcmtlZCBhcyBgY29uZmlybWVkYCBvciBgZGlzbWlzc2VkYCBpdCB3aWxsIG5vIGxvbmdlciBiZSB1cGRhdGVkIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGFzIGl0IHdhcyB3aGVuIHRoZSByZXZpZXcgd2FzIGZpcnN0IGNvbmR1Y3RlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cyB7XG4gICAgQ29uZmlybWVkID0gJ2NvbmZpcm1lZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgRGlzbWlzc2VkID0gJ2Rpc21pc3NlZCdcbn1cblxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGNoYW5nZXMgdG8gd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmdpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHByb2dyYW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGluZGl2aWR1YWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgSW5kaXZpZHVhbHNcXFwiLCBcXFwiVVMgQ2FyZGhvbGRlcnNcXFwiLCBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXMgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1zOiBBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHJldmlld3MgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lIDkuIGFueSB0byB1bmtub3duXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtcz86IFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgYmVpbmcgc2NyZWVuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgY3JlYXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHNjcmVlbmluZyBpcyBzdGlsbCBwZW5kaW5nIHJldmlldywgaGFzIGJlZW4gcmVqZWN0ZWQsIG9yIGhhcyBiZWVuIGNsZWFyZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXMge1xuICAgIFJlamVjdGVkID0gJ3JlamVjdGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBDbGVhcmVkID0gJ2NsZWFyZWQnXG59XG5cbi8qKlxuICogTmFtZXMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQgYXMgbG93IHF1YWxpdHkgZWl0aGVyIGJ5IHRoZWlyIGBzb3VyY2VgIGxpc3QsIG9yIGJ5IGBwbGFpZGAgYnkgYSBzZXJpZXMgb2YgYWRkaXRpb25hbCBjaGVja3MgZG9uZSBieSBQbGFpZC4gUGxhaWQgZG9lcyBub3QgZXZlciBzdXJmYWNlIGEgaGl0IGFzIGEgcmVzdWx0IG9mIGEgd2VhayBuYW1lIGFsb25lLiBJZiBhIG5hbWUgaGFzIG5vIHF1YWxpdHkgaXNzdWVzLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vbmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbiB7XG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBTb3VyY2UgPSAnc291cmNlJyxcbiAgICBQbGFpZCA9ICdwbGFpZCdcbn1cblxuLyoqXG4gKiBUaGUgUGxhaWQgZW52aXJvbm1lbnQgdGhlIHdlYmhvb2sgd2FzIHNlbnQgZnJvbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va0Vudmlyb25tZW50VmFsdWVzIHtcbiAgICBEZXZlbG9wbWVudCA9ICdkZXZlbG9wbWVudCcsXG4gICAgU2FuZGJveCA9ICdzYW5kYm94JyxcbiAgICBQcm9kdWN0aW9uID0gJ3Byb2R1Y3Rpb24nXG59XG5cbi8qKlxuICogVGhlIHdlYmhvb2sgdHlwZXMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgdGhpcyB0ZXN0IGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va1R5cGUge1xuICAgIEF1dGggPSAnQVVUSCcsXG4gICAgSG9sZGluZ3MgPSAnSE9MRElOR1MnLFxuICAgIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zID0gJ0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUycsXG4gICAgSXRlbSA9ICdJVEVNJyxcbiAgICBMaWFiaWxpdGllcyA9ICdMSUFCSUxJVElFUycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ1RSQU5TQUNUSU9OUycsXG4gICAgQXNzZXRzID0gJ0FTU0VUUydcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIHdlYmhvb2sgaXMgdXBkYXRlZC4gVGhpcyB3aWxsIGJlIHNlbnQgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgbmV3X3dlYmhvb2tfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gKi9cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZSA5LiBhbnkgdG8gdW5rbm93blxuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBJRCAoIGBraWRgICkgZnJvbSB0aGUgSldUIGhlYWRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGtleV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0pXS1B1YmxpY0tleX1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAga2V5OiBKV0tQdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIHByZS10YXggZWFybmluZ3MsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmUgOS4gYW55IHRvIHVua25vd25cbmV4cG9ydCBpbnRlcmZhY2UgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQ6IGFzeW5jIChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzQmFsYW5jZUdldCcsICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JywgYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIEZvciBpdGVtcyB0aGF0IHdlbnQgdGhyb3VnaCB0aGUgdXBkYXRlZCBhY2NvdW50IHNlbGVjdGlvbiBwYW5lLCB0aGlzIGVuZHBvaW50IG9ubHkgcmV0dXJucyBhY2NvdW50cyB0aGF0IHdlcmUgcGVybWlzc2lvbmVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSBpbml0aWFsbHkgY3JlYXRlZCB0aGUgSXRlbS4gSWYgYSB1c2VyIGNyZWF0ZXMgYSBuZXcgYWNjb3VudCBhZnRlciB0aGUgaW5pdGlhbCBsaW5rLCB5b3UgY2FuIGNhcHR1cmUgdGhpcyBldmVudCB0aHJvdWdoIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQ6IGFzeW5jIChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzR2V0JywgJ2FjY291bnRzR2V0UmVxdWVzdCcsIGFjY291bnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0OiBhc3luYyAoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhcHBsaWNhdGlvbkdldCcsICdhcHBsaWNhdGlvbkdldFJlcXVlc3QnLCBhcHBsaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FwcGxpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0JywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydENyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRDcmVhdGUnLCAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcjogYXN5bmMgKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRGaWx0ZXInLCAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JywgYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZmlsdGVyYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0R2V0JywgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldDogYXN5bmMgKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRQZGZHZXQnLCAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaDogYXN5bmMgKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZWZyZXNoJywgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnLCBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZW1vdmUnLCAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQ6IGFzeW5jIChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2F1dGhHZXQnLCAnYXV0aEdldFJlcXVlc3QnLCBhdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQmFsYW5jZUdldCcsICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWw6IGFzeW5jIChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNhbmNlbCcsICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDcmVhdGUnLCAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRMaXN0JywgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRTeW5jJywgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckdldCcsICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYXNlUmVwb3J0R2V0OiBhc3luYyAoYmFzZVJlcG9ydEdldFJlcXVlc3Q6IEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Jhc2VSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYXNlUmVwb3J0R2V0JywgJ2Jhc2VSZXBvcnRHZXRSZXF1ZXN0JywgYmFzZVJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9iYXNlX3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uRHVwbGljYXRlR2V0OiBhc3luYyAoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25EdXBsaWNhdGVHZXQnLCAnYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCcsIGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9kdXBsaWNhdGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLiAgTm90ZTogSWYgeW91IGFyZSBjcmVhdGluZyB1c2VycyB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGhpc3RvcmljYWwgZnJhdWQgZGF0YSwgeW91IHNob3VsZCB1c2UgdGhlIGAvYmVhY29uL3VzZXIvY3JlYXRlYCBlbmRwb2ludCBpbnN0ZWFkIGFuZCBlbWJlZCB0aGUgZnJhdWQgcmVwb3J0IGluIHRoZSByZXF1ZXN0LiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIEJlYWNvbiBVc2VyIHlvdSBjcmVhdGUgd2lsbCBub3QgYmUgc3ViamVjdCB0byBhbnkgYmlsbGluZyBjb3N0cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGU6IGFzeW5jIChiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydENyZWF0ZScsICdiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0JywgYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldDogYXN5bmMgKGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0R2V0JywgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0OiBhc3luYyAoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRMaXN0JywgJ2JlYWNvblJlcG9ydExpc3RSZXF1ZXN0JywgYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQnLCAnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0JywgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGU6IGFzeW5jIChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJDcmVhdGUnLCAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0OiBhc3luYyAoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyR2V0JywgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JywgYmVhY29uVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXc6IGFzeW5jIChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJSZXZpZXcnLCAnYmVhY29uVXNlclJldmlld1JlcXVlc3QnLCBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvcmV2aWV3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZTogYXN5bmMgKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlclVwZGF0ZScsICdiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCcsIGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXRlZ29yaWVzR2V0OiBhc3luYyAoYm9keTogb2JqZWN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NhdGVnb3JpZXNHZXQnLCAnYm9keScsIGJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NhdGVnb3JpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUJhbmtJbmNvbWVHZXQnLCAnY3JhQmFua0luY29tZUdldFJlcXVlc3QnLCBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVHZXQnLCAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0OiBhc3luYyAoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lUGRmR2V0JywgJ2NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua0luY29tZVJlZnJlc2gnLCAnY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGU6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlJywgJ2NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0OiBhc3luYyAoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQnLCAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEVtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEVtcGxveW1lbnRHZXQnLCAnY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QnLCBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQ6IGFzeW5jIChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0JywgJ2NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCcsIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZUdldDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZUdldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChyZXF1ZXN0Qm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjazogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaDogYXN5bmMgKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2gnLCAnY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGBmcmF1ZF9yaXNrYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnQgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZTogYXN5bmMgKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlDcmVhdGUnLCAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JywgY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlHZXQ6IGFzeW5jIChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRSZWxheUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlbGF5R2V0JywgJ2NyZWRpdFJlbGF5R2V0UmVxdWVzdCcsIGNyZWRpdFJlbGF5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3JlbGF5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UGRmR2V0OiBhc3luYyAoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVBkZkdldCcsICdjcmVkaXRSZWxheVBERkdldFJlcXVlc3QnLCBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlbW92ZTogYXN5bmMgKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZW1vdmUnLCAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JywgY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0U2Vzc2lvbnNHZXQ6IGFzeW5jIChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFNlc3Npb25zR2V0JywgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcsIGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3Nlc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJHZXQ6IGFzeW5jIChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJHZXQnLCAnZGFzaGJvYXJkVXNlckdldFJlcXVlc3QnLCBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGRhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGRhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGFzaGJvYXJkVXNlckxpc3Q6IGFzeW5jIChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Rhc2hib2FyZFVzZXJMaXN0JywgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcsIGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGFzaGJvYXJkX3VzZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlOiBhc3luYyAoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldDogYXN5bmMgKGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaEdldCcsICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldCcsICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQ6IGFzeW5jIChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5R2V0JywgJ2lkZW50aXR5R2V0UmVxdWVzdCcsIGlkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaDogYXN5bmMgKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlNYXRjaCcsICdpZGVudGl0eU1hdGNoUmVxdWVzdCcsIGlkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vYXV0b2ZpbGwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25HZXQnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeScsICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vcmV0cnlgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjaycsICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0OiBhc3luYyAoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXQnLCAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaDogYXN5bmMgKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zU2VhcmNoJywgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzQXV0aEdldCcsICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQ3JlYXRlUHVibGljVG9rZW4nLCAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldDogYXN5bmMgKGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUdldCcsICdpdGVtR2V0UmVxdWVzdCcsIGl0ZW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydDogYXN5bmMgKGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtSW1wb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUltcG9ydCcsICdpdGVtSW1wb3J0UmVxdWVzdCcsIGl0ZW1JbXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2ltcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtSW1wb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZTogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UnLCAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmU6IGFzeW5jIChpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1SZW1vdmUnLCAnaXRlbVJlbW92ZVJlcXVlc3QnLCBpdGVtUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlOiBhc3luYyAoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtV2ViaG9va1VwZGF0ZScsICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQ6IGFzeW5jIChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaWFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpYWJpbGl0aWVzR2V0JywgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcsIGxpYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUNyZWF0ZTogYXN5bmMgKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua0RlbGl2ZXJ5Q3JlYXRlJywgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnLCBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlHZXQ6IGFzeW5jIChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUdldCcsICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlOiBhc3luYyAobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UnLCAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcsIGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQ6IGFzeW5jIChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtUb2tlbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtUb2tlbkdldCcsICdsaW5rVG9rZW5HZXRSZXF1ZXN0JywgbGlua1Rva2VuR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGluay90b2tlbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua1Rva2VuR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckNyZWF0ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyQ3JlYXRlJywgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZTogYXN5bmMgKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyUmVtb3ZlJywgJ3BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldCcsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UnLCAncGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UnLCAncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvcmV2ZXJzZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3Q6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlOiBhc3luYyAocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUNyZWF0ZScsICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldDogYXN5bmMgKHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVHZXQnLCAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmU6IGFzeW5jIChwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlUmVtb3ZlJywgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQ6IGFzeW5jIChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFjY291bnRHZXQnLCAncHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QnLCBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldDogYXN5bmMgKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXV0aEdldCcsICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcsIHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldDogYXN5bmMgKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFsYW5jZUdldCcsICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcsIHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlJywgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldDogYXN5bmMgKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySWRlbnRpdHlHZXQnLCAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JywgcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0OiBhc3luYyAocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JMaWFiaWxpdGllc0dldCcsICdwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQnLCAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIElmIHRoZSBhY2NvdW50IG11c3QgYmUgbGlua2VkIHRvIGEgbmV3IG9yIGRpZmZlcmVudCBwYXJ0bmVyIHJlc291cmNlLCBjcmVhdGUgYSBuZXcgSXRlbSBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCB0aGUgTGluayBmbG93IGFnYWluOyBhIG5ldyBwcm9jZXNzb3IgdG9rZW4gY2FuIHRoZW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuIFByb2Nlc3NvciB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQ6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYzogYXN5bmMgKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYycsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9vaycsICdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbUZpcmVXZWJob29rJywgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtUmVzZXRMb2dpbicsICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzOiBhc3luYyAoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cycsICdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QnLCBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50czogYXN5bmMgKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMnLCAnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0Jywgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4nLCAnc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QnLCBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQ6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Q6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3QnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxEZWNpc2lvblJlcG9ydCcsICdzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlOiBhc3luYyAoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxFdmFsdWF0ZScsICdzaWduYWxFdmFsdWF0ZVJlcXVlc3QnLCBzaWduYWxFdmFsdWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkOiBhc3luYyAoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzRG93bmxvYWQnLCAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcsIHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvZG93bmxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Q6IGFzeW5jIChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNMaXN0JywgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcsIHN0YXRlbWVudHNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2g6IGFzeW5jIChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3N0YXRlbWVudHNSZWZyZXNoJywgJ3N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCcsIHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc3RhdGVtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbmhhbmNlOiBhc3luYyAodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNFbmhhbmNlJywgJ3RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2g6IGFzeW5jICh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VucmljaCcsICd0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2VucmljaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiBGb3Igb3B0aW1hbCByZXN1bHRzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgY3VzdG9tZXJzIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIGl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zICh1c2luZyB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIG9wdGlvbikuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVmcmVzaCcsICd0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlJywgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzTGlzdDogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNMaXN0JywgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmU6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlJywgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jICh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1N5bmMnLCAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0JywgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGU6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZScsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jICh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQmFsYW5jZUdldCcsICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWw6IGFzeW5jICh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FuY2VsJywgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0OiBhc3luYyAodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhcGFiaWxpdGllc0dldCcsICd0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QnLCB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0OiBhc3luYyAodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQnLCAndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCcsIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDcmVhdGUnLCAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkOiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkJywgJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0OiBhc3luYyAodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCcsICd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QnLCB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jICh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRMaXN0JywgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jOiBhc3luYyAodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50U3luYycsICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudENyZWF0ZScsICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQ6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVySW50ZW50R2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQ6IGFzeW5jICh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdCcsICd0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlOiBhc3luYyAodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUnLCAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyR2V0JywgJ3RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3OiBhc3luYyAodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlcldpdGhkcmF3JywgJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3Q6IGFzeW5jICh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGlzdCcsICd0cmFuc2Zlckxpc3RSZXF1ZXN0JywgdHJhbnNmZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1ldHJpY3NHZXQ6IGFzeW5jICh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTWV0cmljc0dldCcsICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JywgdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yR2V0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3Q6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3QnLCAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZScsICd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZScsICd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0dldCcsICd0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0xpc3Q6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdCcsICd0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENhbmNlbCcsICd0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlJywgJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRHZXQ6IGFzeW5jICh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kR2V0JywgJ3RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRMaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0OiBhc3luYyAodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QnLCAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwR2V0JywgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0OiBhc3luYyAodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwTGlzdCcsICd0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNyZWF0ZTogYXN5bmMgKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckNyZWF0ZScsICd1c2VyQ3JlYXRlUmVxdWVzdCcsIHVzZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gVGhlIGB1c2VyX3Rva2VuYCBzaG91bGQgYmUgaW4gdGhlIHJlc3BvbnNlIG9mIGAvdXNlci9jcmVhdGVgIGNhbGwgIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCB3aXRoIGEgbm9uLWV4aXN0IGB1c2VyX3Rva2VuYCwgdGhlIGNhbGwgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgdG9rZW4gaXMgbm90IGZvdW5kLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGU6IGFzeW5jICh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJVcGRhdGUnLCAndXNlclVwZGF0ZVJlcXVlc3QnLCB1c2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlOiBhc3luYyAod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRDcmVhdGUnLCAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcsIHdhbGxldENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldEdldDogYXN5bmMgKHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0R2V0JywgJ3dhbGxldEdldFJlcXVlc3QnLCB3YWxsZXRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0OiBhc3luYyAod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRMaXN0JywgJ3dhbGxldExpc3RSZXF1ZXN0Jywgd2FsbGV0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGU6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZScsICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25HZXQnLCAnd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25MaXN0JywgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnLCB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXN0b3J5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2hpdC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQ6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldDogYXN5bmMgKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCcsICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcsIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB0aGUgY3VzdG9tZXIgdG8gcmV0cmlldmUgYSBCYXNlIFJlcG9ydC4gQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Jhc2VSZXBvcnRHZXRSZXF1ZXN0fSBiYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3Q6IEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhc2VSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbS4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0IChha2EgVk9BIC0gVmVyaWZpY2F0aW9uIE9mIEFzc2V0cyksIGFuZCBhIFZlcmlmaWNhdGlvbiBPZiBFbXBsb3ltZW50IChWT0UpIHJlcG9ydCBpZiB0aGlzIG9uZSBpcyBhdmFpbGFibGUuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYGZyYXVkX3Jpc2tgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYCBlbmRwb2ludCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWZyZXNoIGEgcmVwb3J0IHRoYXQgd2FzIHJlbGF5ZWQgdG8gdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gQSBuZXcgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnQgcGFyYW1ldGVycywgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSByZXBvcnQgb2YgYSByZWxheSB0b2tlbiAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRhc2hib2FyZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBkYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnRzLCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW0lOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gXFxcIk5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgQmFuayBhY2NvdW50IHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gSWYgdGhlIGFjY291bnQgbXVzdCBiZSBsaW5rZWQgdG8gYSBuZXcgb3IgZGlmZmVyZW50IHBhcnRuZXIgcmVzb3VyY2UsIGNyZWF0ZSBhIG5ldyBJdGVtIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cgYWdhaW47IGEgbmV3IHByb2Nlc3NvciB0b2tlbiBjYW4gdGhlbiBiZSBjcmVhdGVkIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gUHJvY2Vzc29yIHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzIG9uIHRoZSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIEJ5IGRlZmF1bHQsIGEgcHJvY2Vzc29yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cyBvbiB0aGUgY29ycmVzcG9uZGluZyBpdGVtLiBUbyByZXN0cmljdCBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggdGhlIGRlc2lyZWQgcHJvZHVjdHMuIFRvIHJlc3RvcmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIGFuIGVtcHR5IGxpc3QuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB5b3VyIG5lZWRzIGFuZCB5b3VyIHByb2Nlc3NvclxcJ3MgbmVlZHMgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFRyYW5zYWN0aW9ucyB1cGRhdGUgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBjcmVhdGVkIHdpdGggQWNjb3VudCBTZWxlY3QgdjIuICBgQVVUSF9EQVRBX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBdXRoIGFzIGFuIGVuYWJsZWQgcHJvZHVjdC4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiBvciBEZXZlbG9wbWVudCAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW5ub3QgYmUgdXNlZCB3aXRoIE9BdXRoIGluc3RpdHV0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBMaW5rIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuICBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIFBsYWlkIHByb2R1Y3RzIGFmdGVyIExpbmssIGUuZy4gSWRlbnRpdHkgb3IgQXNzZXRzLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGFmdGVyIHRob3NlIHByb2R1Y3QgY2FsbHMgYXJlIGNvbXBsZXRlLiAgRXhhbXBsZSBmbG93OiBMaW5rIGlzIGluaXRpYWxpemVkIHdpdGggQXV0aCwgY2FsbCBgL2F1dGgvZ2V0YCBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLCBjYWxsIGAvaWRlbnRpdHkvZ2V0YCB0byByZXRyaWV2ZSBiYW5rIG93bmVyc2hpcCBkZXRhaWxzLCB0aGVuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gYmVnaW4gU2lnbmFsIGRhdGEgY29sbGVjdGlvbi4gTGF0ZXIsIG9uY2UgeW91IGhhdmUgb2J0YWluZWQgZGV0YWlscyBhYm91dCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgdXNlciwgY2FsbCBgL3NpZ25hbC9ldmFsdWF0ZWAgZm9yIGEgU2lnbmFsIHNjb3JlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFtSZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIHdpdGggc3BlY2lmaWMgcHJvZHVjdCBjb21iaW5hdGlvbnNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZWNvbW1lbmRhdGlvbnMtZm9yLWluaXRpYWxpemluZy1saW5rLXdpdGgtc3BlY2lmaWMtcHJvZHVjdC1jb21iaW5hdGlvbnMpLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gRm9yIG9wdGltYWwgcmVzdWx0cywgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIGN1c3RvbWVycyB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBpdGVtcyB3aXRoIFRyYW5zYWN0aW9ucyAodXNpbmcgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBvcHRpb24pLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6IElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYElURU1fTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2Zlci4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9yc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUHJvY2Vzc2luZyBvZiB0aGUgcmVmdW5kIHdpbGwgbm90IG9jY3VyIHVudGlsIGF0IGxlYXN0IDQgYnVzaW5lc3MgZGF5cyBmb2xsb3dpbmcgdGhlIHRyYW5zZmVyXFwncyBzZXR0bGVtZW50IGRhdGUsIHBsdXMgYW55IGhvbGQvc2V0dGxlbWVudCBkZWxheXMuIFRoaXMgMy1kYXkgd2luZG93IGhlbHBzIGJldHRlciBwcm90ZWN0IHlvdXIgYnVzaW5lc3MgZnJvbSByZWd1bGFyIEFDSCByZXR1cm5zLiBDb25zdW1lciBpbml0aWF0ZWQgcmV0dXJucyAodW5hdXRob3JpemVkIHJldHVybnMpIGNvdWxkIHN0aWxsIGhhcHBlbiBmb3IgYWJvdXQgNjAgZGF5cyBmcm9tIHRoZSBzZXR0bGVtZW50IGRhdGUuIElmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciBpcyBjYW5jZWxlZCwgcmV0dXJuZWQgb3IgZmFpbGVkLCBhbGwgcGVuZGluZyByZWZ1bmRzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjYW5jZWxlZC4gUHJvY2Vzc2VkIHJlZnVuZHMgY2Fubm90IGJlIHJldm9rZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgaW5jb21lIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgaW5jb21lIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBUaGUgYHVzZXJfdG9rZW5gIHNob3VsZCBiZSBpbiB0aGUgcmVzcG9uc2Ugb2YgYC91c2VyL2NyZWF0ZWAgY2FsbCAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IHdpdGggYSBub24tZXhpc3QgYHVzZXJfdG9rZW5gLCB0aGUgY2FsbCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciB0b2tlbiBpcyBub3QgZm91bmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFBsYWlkQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFwcGxpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGF1dGhgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGN1c3RvbWVyIHRvIHJldHJpZXZlIGEgQmFzZSBSZXBvcnQuIEN1c3RvbWVycyBzaG91bGQgcGFzcyBpbiB0aGUgYHVzZXJfdG9rZW5gIGNyZWF0ZWQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYXNlUmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZpZXcgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBmb3IgYSBzcGVjaWZpZWQgdXNlciBpbiBQREYgZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYGZyYXVkX3Jpc2tgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudCAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgZGFzaGJvYXJkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBkYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95ZXJzU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgaWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBJZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIElkZW50aXR5IHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbW9zdCB1cCB0byBkYXRlIElkZW50aXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIEZpbmFuY2lhbCBJbnN0aXR1dGlvbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIElkZW50aXR5IGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvZiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGF1dG9maWxsIGZvciBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gYW5kIHJldHVybnMgYSBgcHJlY2hlY2tfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHByb3ZpZGluZyB0aGUgYHByZWNoZWNrX2lkYCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSBgcHJlY2hlY2tfaWRgIGNhbiBzdGlsbCBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGVpdGhlciBgZW1wbG95ZXJgIG9yIGB0cmFuc2FjdGlvbnNfYWNjZXNzX3Rva2Vuc2AgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudHMsIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBcXFwiTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdDogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5R2V0UmVxdWVzdH0gbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtEZWxpdmVyeUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgcGF5bWVudCBjb25zZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSBwYXltZW50cyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFBheW1lbnQgY29uc2VudHMgYXJlIGNyZWF0ZWQgd2l0aCBgVU5BVVRIT1JJU0VEYCBzdGF0dXMgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBhdXRob3Jpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBwYXltZW50cyBjYW4gYmUgaW5pdGlhdGVkLiAgQ29uc2VudHMgY2FuIGJlIGxpbWl0ZWQgaW4gdGltZSBhbmQgc2NvcGUsIGFuZCBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgZGVzY3JpYmUgbGltaXRhdGlvbnMgZm9yIHBheW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgY29uc2VudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBjb25zdHJhaW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgIGVuZHBvaW50IHRvIHJlbW92ZSBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gT25jZSBpdOKAmXMgcmVtb3ZlZCwgaXQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gYXMgYSBwcm9jZXNzb3IgdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gb3VyIGVycm9yIGRvY3VtZW50YXRpb24gb24gW2l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS4gVG8gcmVkdWNlIHRoaXMgbGF0ZW5jeSwgeW91IGNhbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIG9uIHRoZSBJdGVtIGJlZm9yZSB5b3UgbmVlZCB0byByZXF1ZXN0IFNpZ25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIEJhbmsgYWNjb3VudCB0b2tlbnMgY2FuIGFsc28gYmUgcmV2b2tlZCwgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBJZiB0aGUgYWNjb3VudCBtdXN0IGJlIGxpbmtlZCB0byBhIG5ldyBvciBkaWZmZXJlbnQgcGFydG5lciByZXNvdXJjZSwgY3JlYXRlIGEgbmV3IEl0ZW0gYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggdGhlIExpbmsgZmxvdyBhZ2FpbjsgYSBuZXcgcHJvY2Vzc29yIHRva2VuIGNhbiB0aGVuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiBQcm9jZXNzb3IgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHRva2VuIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29ycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3R9IHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbm5vdCBiZSB1c2VkIHdpdGggT0F1dGggaW5zdGl0dXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIFRlc3QgY2xvY2tzIGFyZSB1c2VkIGZvciB0ZXN0aW5nIHJlY3VycmluZyB0cmFuc2ZlcnMgaW4gU2FuZGJveC4gIEEgdGVzdCBjbG9jayBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIHVwIHRvIDUgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIExpbmsgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcywgZGV2ZWxvcGluZyBhIFNpZ25hbCBzY29yZS4gIElmIHlvdSBhcmUgdXNpbmcgb3RoZXIgUGxhaWQgcHJvZHVjdHMgYWZ0ZXIgTGluaywgZS5nLiBJZGVudGl0eSBvciBBc3NldHMsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgYWZ0ZXIgdGhvc2UgcHJvZHVjdCBjYWxscyBhcmUgY29tcGxldGUuICBFeGFtcGxlIGZsb3c6IExpbmsgaXMgaW5pdGlhbGl6ZWQgd2l0aCBBdXRoLCBjYWxsIGAvYXV0aC9nZXRgIGZvciB0aGUgYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXIsIGNhbGwgYC9pZGVudGl0eS9nZXRgIHRvIHJldHJpZXZlIGJhbmsgb3duZXJzaGlwIGRldGFpbHMsIHRoZW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBiZWdpbiBTaWduYWwgZGF0YSBjb2xsZWN0aW9uLiBMYXRlciwgb25jZSB5b3UgaGF2ZSBvYnRhaW5lZCBkZXRhaWxzIGFib3V0IHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBmcm9tIHRoZSB1c2VyLCBjYWxsIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgYSBTaWduYWwgc2NvcmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgW1JlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgd2l0aCBzcGVjaWZpYyBwcm9kdWN0IGNvbWJpbmF0aW9uc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlY29tbWVuZGF0aW9ucy1mb3ItaW5pdGlhbGl6aW5nLWxpbmstd2l0aC1zcGVjaWZpYy1wcm9kdWN0LWNvbWJpbmF0aW9ucykuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuIEZvciBvcHRpbWFsIHJlc3VsdHMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCBjdXN0b21lcnMgdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgaXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMgKHVzaW5nIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgb3B0aW9uKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVySW50ZW50R2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBQcm9jZXNzaW5nIG9mIHRoZSByZWZ1bmQgd2lsbCBub3Qgb2NjdXIgdW50aWwgYXQgbGVhc3QgNCBidXNpbmVzcyBkYXlzIGZvbGxvd2luZyB0aGUgdHJhbnNmZXJcXCdzIHNldHRsZW1lbnQgZGF0ZSwgcGx1cyBhbnkgaG9sZC9zZXR0bGVtZW50IGRlbGF5cy4gVGhpcyAzLWRheSB3aW5kb3cgaGVscHMgYmV0dGVyIHByb3RlY3QgeW91ciBidXNpbmVzcyBmcm9tIHJlZ3VsYXIgQUNIIHJldHVybnMuIENvbnN1bWVyIGluaXRpYXRlZCByZXR1cm5zICh1bmF1dGhvcml6ZWQgcmV0dXJucykgY291bGQgc3RpbGwgaGFwcGVuIGZvciBhYm91dCA2MCBkYXlzIGZyb20gdGhlIHNldHRsZW1lbnQgZGF0ZS4gSWYgdGhlIG9yaWdpbmFsIHRyYW5zZmVyIGlzIGNhbmNlbGVkLCByZXR1cm5lZCBvciBmYWlsZWQsIGFsbCBwZW5kaW5nIHJlZnVuZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNhbmNlbGVkLiBQcm9jZXNzZWQgcmVmdW5kcyBjYW5ub3QgYmUgcmV2b2tlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIHNldCBvZiByZXR1cm5zIHRoYXQgd2VyZSBiYXRjaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuIFRoZSBzdW0gb2YgYW1vdW50cyBvZiByZXR1cm5zIHJldHJpZXZlZCBieSB0aGlzIHJlcXVlc3QgZXF1YWxzIHRoZSBhbW91bnQgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBpbmNvbWUgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBpbmNvbWUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBUaGUgYHVzZXJfdG9rZW5gIHNob3VsZCBiZSBpbiB0aGUgcmVzcG9uc2Ugb2YgYC91c2VyL2NyZWF0ZWAgY2FsbCAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IHdpdGggYSBub24tZXhpc3QgYHVzZXJfdG9rZW5gLCB0aGUgY2FsbCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciB0b2tlbiBpcyBub3QgZm91bmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdDogV2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IFdhdGNobGlzdCBTY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBXYXRjaGxpc3QgUHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGEgc3BlY2lmaWMgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGN1c3RvbWVyIGluZm9ybWF0aW9uLCBjb3JyZWN0IG91dGRhdGVkIGluZm9ybWF0aW9uLCBhZGQgYSByZWZlcmVuY2UgaWQsIGFzc2lnbiB0aGUgaW5kaXZpZHVhbCB0byBhIHJldmlld2VyLCBhbmQgdXBkYXRlIHdoaWNoIHByb2dyYW0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtYXkgbm90IHVwZGF0ZSBgc2VhcmNoX3Rlcm1zYCBhbmQgYHN0YXR1c2AgYXQgdGhlIHNhbWUgdGltZSBzaW5jZSBlZGl0aW5nIGBzZWFyY2hfdGVybXNgIG1heSB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBgc3RhdHVzYCBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBQbGFpZEFwaVxuICogQGV4dGVuZHMge0Jhc2VBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBQbGFpZEFwaSBleHRlbmRzIEJhc2VBUEkge1xuICAgIC8qKlxuICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gRm9yIGl0ZW1zIHRoYXQgd2VudCB0aHJvdWdoIHRoZSB1cGRhdGVkIGFjY291bnQgc2VsZWN0aW9uIHBhbmUsIHRoaXMgZW5kcG9pbnQgb25seSByZXR1cm5zIGFjY291bnRzIHRoYXQgd2VyZSBwZXJtaXNzaW9uZWQgYnkgdGhlIHVzZXIgd2hlbiB0aGV5IGluaXRpYWxseSBjcmVhdGVkIHRoZSBJdGVtLiBJZiBhIHVzZXIgY3JlYXRlcyBhIG5ldyBhY2NvdW50IGFmdGVyIHRoZSBpbml0aWFsIGxpbmssIHlvdSBjYW4gY2FwdHVyZSB0aGlzIGV2ZW50IHRocm91Z2ggdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB0aGUgY3VzdG9tZXIgdG8gcmV0cmlldmUgYSBCYXNlIFJlcG9ydC4gQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICogQHBhcmFtIHtCYXNlUmVwb3J0R2V0UmVxdWVzdH0gYmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYXNlUmVwb3J0R2V0KGJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhc2VSZXBvcnRHZXQoYmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuICBOb3RlOiBJZiB5b3UgYXJlIGNyZWF0aW5nIHVzZXJzIHdpdGggdGhlIGV4cHJlc3MgcHVycG9zZSBvZiBwcm92aWRpbmcgaGlzdG9yaWNhbCBmcmF1ZCBkYXRhLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYC9iZWFjb24vdXNlci9jcmVhdGVgIGVuZHBvaW50IGluc3RlYWQgYW5kIGVtYmVkIHRoZSBmcmF1ZCByZXBvcnQgaW4gdGhlIHJlcXVlc3QuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgQmVhY29uIFVzZXIgeW91IGNyZWF0ZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGFueSBiaWxsaW5nIGNvc3RzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBCZWFjb24gVXNlci4gIFRoZSBCZWFjb24gVXNlciBpcyByZXR1cm5lZCB3aXRoIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBhIGBzdGF0dXNgIGJhc2VkIG9uIHRoZSBCZWFjb24gTmV0d29yayBkdXBsaWNhdGUgcmVjb3JkIGFuZCBmcmF1ZCBjaGVja3MuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0uICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgZnJhdWRfcmlza2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gKGJldGEpXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuIChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIHlvdXIgZW5kIHVzZXJzIGFmdGVyIHRoZXkgY29tcGxldGUgdGhlIExpbmsgZmxvdy4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIHRoYXQgeW91ciB1c2VyIGNvbXBsZXRlZCwgd2hlcmUgZWFjaCBzZXNzaW9uIGluY2x1ZGVzIHRoZSByZXN1bHRzIGZyb20gdGhlIExpbmsgZmxvdy4gIFRoZXNlIHJlc3VsdHMgaW5jbHVkZSBkZXRhaWxzIGFib3V0IHRoZSBJdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYW5kIHNvbWUgcHJvZHVjdCByZWxhdGVkIG1ldGFkYXRhIChzaG93aW5nLCBmb3IgZXhhbXBsZSwgd2hldGhlciB0aGUgdXNlciBmaW5pc2hlZCB0aGUgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0ZXApLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXNoYm9hcmQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGRhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBhbnkgSWRlbnRpdHktZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIElkZW50aXR5IGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pZGVudGl0eS9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vayBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaWRlbnRpdHkvI2RlZmF1bHRfdXBkYXRlKS4gYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9mIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvbuKAmXMgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnTigJlzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50cywgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFxcXCJOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdDogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAqIEBzdW1tYXJ5IFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgTm90ZSB0aGF0IGluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaXNzdWluZyBhbiBgL2l0ZW0vcmVtb3ZlYCAgcmVxdWVzdCB3aWxsIG5vdCBkZWNyZW1lbnQgeW91ciBsaXZlIGNyZWRlbnRpYWwgY291bnQuIFRvIGluY3JlYXNlIHlvdXIgY3JlZGVudGlhbCBhY2NvdW50IGluIERldmVsb3BtZW50LCBjb250YWN0IFN1cHBvcnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIFByb2R1Y3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuIFxuICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZyBvciBzYXZpbmdzIGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS4gIFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgSWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBCYW5rIGFjY291bnQgdG9rZW5zIGNhbiBhbHNvIGJlIHJldm9rZWQsIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gSWYgdGhlIGFjY291bnQgbXVzdCBiZSBsaW5rZWQgdG8gYSBuZXcgb3IgZGlmZmVyZW50IHBhcnRuZXIgcmVzb3VyY2UsIGNyZWF0ZSBhIG5ldyBJdGVtIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cgYWdhaW47IGEgbmV3IHByb2Nlc3NvciB0b2tlbiBjYW4gdGhlbiBiZSBjcmVhdGVkIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gUHJvY2Vzc29yIHRva2VucyBjYW4gYWxzbyBiZSByZXZva2VkLCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3JzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXBsYWNlcyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaXRzIGFzc29jaWF0ZWQgd2ViaG9va3MgZm9yIG1vc3QgY29tbW9uIHVzZS1jYXNlcy4gIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIGFuZCBnZXQgdXBkYXRlcyBzeW5jaHJvbm91c2x5IGluIGEgc3RyZWFtLWxpa2UgbWFubmVyLCB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhpcyBlbmRwb2ludCBwcm92aWRlcyB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBSZXR1cm5lZCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBncm91cGVkIGludG8gdGhyZWUgdHlwZXMgb2YgdXBkYXRlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGUgQVBJLiAgSW4gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgdGhlIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb2Nlc3NvciB0b2tlbiB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBwcm9jZXNzb3IgdG9rZW4uIEluIHN1YnNlcXVlbnQgY2FsbHMsIHNlbmQgdGhlIGBuZXh0X2N1cnNvcmAgdG8gcmVjZWl2ZSBvbmx5IHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpdGggdGhlIG5ldyBjdXJzb3IsIHB1bGxpbmcgYWxsIHVwZGF0ZXMsIHVudGlsIGBoYXNfbW9yZWAgaXMgYGZhbHNlYC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSwgd2hpY2ggY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IsIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBXaGVuZXZlciBuZXcgb3IgdXBkYXRlZCB0cmFuc2FjdGlvbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGZvciBuZXdseSBjcmVhdGVkIHByb2Nlc3NvciB0b2tlbnMsIGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgSXRlbSBpcyBjcmVhdGVkLCBidXQgdGhlIHByb2Nlc3MgY2FuIHRha2UgYW55d2hlcmUgZnJvbSBhIGZldyBzZWNvbmRzIHRvIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZSwgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3NvcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgUGF5cm9sbCBvciBEb2N1bWVudCBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogVHJhbnNhY3Rpb25zIHVwZGF0ZSB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIGNyZWF0ZWQgd2l0aCBBY2NvdW50IFNlbGVjdCB2Mi4gIGBBVVRIX0RBVEFfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gY3JlYXRlZCB3aXRoIEF1dGggYXMgYW4gZW5hYmxlZCBwcm9kdWN0LiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50IChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2Fubm90IGJlIHVzZWQgd2l0aCBPQXV0aCBpbnN0aXR1dGlvbnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gTGluayBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiAgSWYgeW91IGFyZSB1c2luZyBvdGhlciBQbGFpZCBwcm9kdWN0cyBhZnRlciBMaW5rLCBlLmcuIElkZW50aXR5IG9yIEFzc2V0cywgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBhZnRlciB0aG9zZSBwcm9kdWN0IGNhbGxzIGFyZSBjb21wbGV0ZS4gIEV4YW1wbGUgZmxvdzogTGluayBpcyBpbml0aWFsaXplZCB3aXRoIEF1dGgsIGNhbGwgYC9hdXRoL2dldGAgZm9yIHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciwgY2FsbCBgL2lkZW50aXR5L2dldGAgdG8gcmV0cmlldmUgYmFuayBvd25lcnNoaXAgZGV0YWlscywgdGhlbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIGJlZ2luIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24uIExhdGVyLCBvbmNlIHlvdSBoYXZlIG9idGFpbmVkIGRldGFpbHMgYWJvdXQgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHVzZXIsIGNhbGwgYC9zaWduYWwvZXZhbHVhdGVgIGZvciBhIFNpZ25hbCBzY29yZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBbUmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayB3aXRoIHNwZWNpZmljIHByb2R1Y3QgY29tYmluYXRpb25zXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jcmVjb21tZW5kYXRpb25zLWZvci1pbml0aWFsaXppbmctbGluay13aXRoLXNwZWNpZmljLXByb2R1Y3QtY29tYmluYXRpb25zKS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaXRlbS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuIEZvciBvcHRpbWFsIHJlc3VsdHMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCBjdXN0b21lcnMgdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgaXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMgKHVzaW5nIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgb3B0aW9uKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gc3Vic2NyaWJlIHRvIGFsbCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGdldCB1cGRhdGVzIHN5bmNocm9ub3VzbHkgaW4gYSBzdHJlYW0tbGlrZSBtYW5uZXIsIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgL3RyYW5zYWN0aW9ucy9nZXRgIHRvIHNpbXBsaWZ5IHRoZSBwcm9jZXNzIG9mIHRyYWNraW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiBUbyBsZWFybiBtb3JlIGFib3V0IG1pZ3JhdGluZyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgUmV0dXJuZWQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ3JvdXBlZCBpbnRvIHRocmVlIHR5cGVzIG9mIHVwZGF0ZSwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgYWRkZWQsIHJlbW92ZWQsIG9yIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gdGhlIEFQSS4gIEluIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZvciBhbiBJdGVtLCB0aGUgZW5kcG9pbnQgd2lsbCByZXR1cm4gYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgSXRlbSB1cCB1bnRpbCB0aGUgdGltZSBvZiB0aGUgQVBJIGNhbGwgKGFzIFxcXCJhZGRzXFxcIiksIHdoaWNoIHRoZW4gZ2VuZXJhdGVzIGEgYG5leHRfY3Vyc29yYCBmb3IgdGhhdCBJdGVtLiBJbiBzdWJzZXF1ZW50IGNhbGxzLCBzZW5kIHRoZSBgbmV4dF9jdXJzb3JgIHRvIHJlY2VpdmUgb25seSB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gVGhlIGBoYXNfbW9yZWAgZmllbGQgc3BlY2lmaWVzIGlmIGFkZGl0aW9uYWwgY2FsbHMgYXJlIG5lY2Vzc2FyeSB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9uIHVwZGF0ZXMuIENhbGwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2l0aCB0aGUgbmV3IGN1cnNvciwgcHVsbGluZyBhbGwgdXBkYXRlcywgdW50aWwgYGhhc19tb3JlYCBpcyBgZmFsc2VgLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgV2hlbmV2ZXIgbmV3IG9yIHVwZGF0ZWQgdHJhbnNhY3Rpb24gZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCBwcm92aWRlIHRoZXNlIHVwZGF0ZXMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIEZvciBuZXdseSBjcmVhdGVkIEl0ZW1zLCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiBQbGFpZCBiZWdpbnMgcHJlcGFyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIHdoZW4gdGhlIEl0ZW0gaXMgY3JlYXRlZCwgYnV0IHRoZSBwcm9jZXNzIGNhbiB0YWtlIGFueXdoZXJlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBzZXZlcmFsIG1pbnV0ZXMgdG8gY29tcGxldGUsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IGRhdGEgaXMgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBgL3RyYW5zYWN0aW9ucy9zeW5jYCBkb2VzIG5vdCBkaXJlY3RseSByZXR1cm4gYmFsYW5jZSBkYXRhLiBUbyBnZXQgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQsIGNhbGwgYC9hY2NvdW50cy9nZXRgLCB3aGljaCBpcyBhIGZyZWUtdG8tdXNlIGVuZHBvaW50IHRoYXQgd2lsbCByZXR1cm4gdGhlIGNhY2hlZCBiYWxhbmNlIGFzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6IElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYElURU1fTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXIuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJJbnRlbnRHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBQcm9jZXNzaW5nIG9mIHRoZSByZWZ1bmQgd2lsbCBub3Qgb2NjdXIgdW50aWwgYXQgbGVhc3QgNCBidXNpbmVzcyBkYXlzIGZvbGxvd2luZyB0aGUgdHJhbnNmZXJcXCdzIHNldHRsZW1lbnQgZGF0ZSwgcGx1cyBhbnkgaG9sZC9zZXR0bGVtZW50IGRlbGF5cy4gVGhpcyAzLWRheSB3aW5kb3cgaGVscHMgYmV0dGVyIHByb3RlY3QgeW91ciBidXNpbmVzcyBmcm9tIHJlZ3VsYXIgQUNIIHJldHVybnMuIENvbnN1bWVyIGluaXRpYXRlZCByZXR1cm5zICh1bmF1dGhvcml6ZWQgcmV0dXJucykgY291bGQgc3RpbGwgaGFwcGVuIGZvciBhYm91dCA2MCBkYXlzIGZyb20gdGhlIHNldHRsZW1lbnQgZGF0ZS4gSWYgdGhlIG9yaWdpbmFsIHRyYW5zZmVyIGlzIGNhbmNlbGVkLCByZXR1cm5lZCBvciBmYWlsZWQsIGFsbCBwZW5kaW5nIHJlZnVuZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNhbmNlbGVkLiBQcm9jZXNzZWQgcmVmdW5kcyBjYW5ub3QgYmUgcmV2b2tlZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIGluY29tZSBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGluY29tZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIFRoZSBgdXNlcl90b2tlbmAgc2hvdWxkIGJlIGluIHRoZSByZXNwb25zZSBvZiBgL3VzZXIvY3JlYXRlYCBjYWxsICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgd2l0aCBhIG5vbi1leGlzdCBgdXNlcl90b2tlbmAsIHRoZSBjYWxsIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIHRva2VuIGlzIG5vdCBmb3VuZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdDogV2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxufVxuXG5cbiJdfQ== \ No newline at end of file diff --git a/dist/base.d.ts b/dist/base.d.ts index 72be31d4..ecacb646 100644 --- a/dist/base.d.ts +++ b/dist/base.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/base.js b/dist/base.js index 43f8599a..4146c097 100644 --- a/dist/base.js +++ b/dist/base.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -62,4 +62,4 @@ class RequiredError extends Error { } } exports.RequiredError = RequiredError; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4Mi4zXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjQ4NS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/common.d.ts b/dist/common.d.ts index c64b50f5..fe21578b 100644 --- a/dist/common.d.ts +++ b/dist/common.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/common.js b/dist/common.js index aa592ec3..d82a01cd 100644 --- a/dist/common.js +++ b/dist/common.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -150,4 +150,4 @@ const createRequestFunction = function (axiosArgs, globalAxios, BASE_PATH, confi }; }; exports.createRequestFunction = createRequestFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODIuM1xuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/configuration.d.ts b/dist/configuration.d.ts index ff9d8ac1..c22de7f8 100644 --- a/dist/configuration.d.ts +++ b/dist/configuration.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/configuration.js b/dist/configuration.js index 401402a9..5b353c44 100644 --- a/dist/configuration.js +++ b/dist/configuration.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -32,7 +32,7 @@ class Configuration { this.baseOptions = {}; if (!this.baseOptions.headers) this.baseOptions.headers = {}; - this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v18.2.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); + this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v18.3.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); } /** * Check if the given MIME is a JSON MIME. @@ -50,4 +50,4 @@ class Configuration { } } exports.Configuration = Configuration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxXQUFXLEVBQUUsK0JBQStCO0NBQzdDLENBQUM7QUFFRixNQUFhLGFBQWE7SUFtRHRCLFlBQVksUUFBaUMsRUFBRTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sbUJBQ3RCLENBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLEVBQ3BDLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUMxQixNQUFNLFFBQVEsR0FBVyxJQUFJLE1BQU0sQ0FBQywrREFBK0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjtBQW5GRCxzQ0FtRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODIuM1xuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmF0aW9uUGFyYW1ldGVycyB7XG4gICAgYXBpS2V5Pzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lOiBzdHJpbmcpID0+IHN0cmluZykgfCAoKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IHN0cmluZykgfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGJhc2VPcHRpb25zPzogYW55O1xuICAgIGZvcm1EYXRhQ3Rvcj86IG5ldyAoKSA9PiBhbnk7XG59XG5cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZXMgMTYtMjVcbmludGVyZmFjZSBQbGFpZEVudmlyb25tZW50IHtcbiAgW2Vudjogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgUGxhaWRFbnZpcm9ubWVudHM6IFBsYWlkRW52aXJvbm1lbnQgPSB7XG4gIHByb2R1Y3Rpb246ICdodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tJyxcbiAgc2FuZGJveDogJ2h0dHBzOi8vc2FuZGJveC5wbGFpZC5jb20nLFxuICBkZXZlbG9wbWVudDogJ2h0dHBzOi8vZGV2ZWxvcG1lbnQucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2MTguMi4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxXQUFXLEVBQUUsK0JBQStCO0NBQzdDLENBQUM7QUFFRixNQUFhLGFBQWE7SUFtRHRCLFlBQVksUUFBaUMsRUFBRTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sbUJBQ3RCLENBQUMsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLEVBQ3BDLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUMxQixNQUFNLFFBQVEsR0FBVyxJQUFJLE1BQU0sQ0FBQywrREFBK0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjtBQW5GRCxzQ0FtRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS40ODUuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmF0aW9uUGFyYW1ldGVycyB7XG4gICAgYXBpS2V5Pzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lOiBzdHJpbmcpID0+IHN0cmluZykgfCAoKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IHN0cmluZykgfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGJhc2VPcHRpb25zPzogYW55O1xuICAgIGZvcm1EYXRhQ3Rvcj86IG5ldyAoKSA9PiBhbnk7XG59XG5cbi8vIEVkaXRlZCBieSBQbGFpZCwgbGluZXMgMTYtMjVcbmludGVyZmFjZSBQbGFpZEVudmlyb25tZW50IHtcbiAgW2Vudjogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgUGxhaWRFbnZpcm9ubWVudHM6IFBsYWlkRW52aXJvbm1lbnQgPSB7XG4gIHByb2R1Y3Rpb246ICdodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tJyxcbiAgc2FuZGJveDogJ2h0dHBzOi8vc2FuZGJveC5wbGFpZC5jb20nLFxuICBkZXZlbG9wbWVudDogJ2h0dHBzOi8vZGV2ZWxvcG1lbnQucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2MTguMy4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index defb48fe..59f9ca0c 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/index.js b/dist/index.js index 4e8dd8e2..72e852fc 100644 --- a/dist/index.js +++ b/dist/index.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -25,4 +25,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { Object.defineProperty(exports, "__esModule", { value: true }); __exportStar(require("./api"), exports); __exportStar(require("./configuration"), exports); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNDgyLjNcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNDg1LjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file diff --git a/index.ts b/index.ts index 1fee8c51..e9944dd0 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.482.3 + * The version of the OpenAPI document: 2020-09-14_1.485.0 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/package.json b/package.json index 08f05590..6818d6c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plaid", - "version": "18.2.0", + "version": "18.3.0", "description": "A node.js client for the Plaid API", "keywords": [ "plaid",